EE_DSnP 板


LINE

我的程式在AdtTest::getPos 125行會出問題 AdtTest::getPos (this=0x80597b8, pos=0) at adtTest.h:124 124 size_t i = 0; 125 AdtType<AdtTestObj>::iterator li = _container.begin(); li 的內容沒有被更改到(變成垃圾) 我猜測可能是 = 或是iterator 的 constructor(const iterator& i)出問題 可是似乎都不是 而且在print的時候也有叫到 AdtType<AdtTestObj>::iterator li = _container.begin(); 就沒有出任何問題.. 以下是我debug的結果: 98 if (_container.erase(getPos(pos))) --s; (gdb) s 進入getPOs(pos) AdtTest::getPos (this=0x80597b8, pos=0) at adtTest.h:124 124 size_t i = 0; 125 AdtType<AdtTestObj>::iterator li = _container.begin(); (gdb) s 進入呼叫li = _container.begin() BSTree<AdtTestObj>::begin (this=0x80597b8) at ../../include/bst.h:254 254 if (_begin_changed){ 260 return _begin; 261 } (gdb) 我有去檢查begin有沒有更動過,所以可以直接O(1) 此時的begin是正確的 iterator (this=0xbf954eb8, i=@0x80597b8) at ../../include/bst.h:140 140 iterator(const iterator& i): _dummy(false) { 141 _his = new HisNode<T>[ARR_CAPACITY(i._his)]; 142 *this = i; 143 } 現在要做出一個新的iterator給外面的li (gdb) p *this._his[_pos].bst_node $1 = { _data = { _data = 394, static _dataRange = 1000 }, _leaf_l = 0x0, _leaf_r = 0x9bba618 } 這時*this的內容是正確的 (gdb) s AdtTest::getPos (this=0x80597b8, pos=0) at adtTest.h:126 126 AdtType<AdtTestObj>::iterator lj = _container.end(); 回到getPos..(顯示了下一行,不過我們關心的是上一行的li) (gdb) p li $2 = { _pos = 3214233272, _dummy = 184, _his = 0x0 } 印出li...裡面的內容是垃圾.. (gdb) n 128 return li; (gdb) p lj $3 = { _pos = 1, _dummy = true, _his = 0x9bbc6cc } 同樣的東西lj就是可以正常複製,資料是正確的 = =||| 想了很久還是不懂為什麼會變這樣 煩請高手解答<(_ _)> --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.45.169.1
1F:推 Neilhahaha:142的*this=i刪掉看看? 12/10 23:40
2F:→ dryman:不行啊..那樣*this內容就沒被改到了 12/10 23:45
3F:→ dryman:那樣的話*this裡就都是垃圾了.. 12/10 23:45
4F:推 timrau:iterator::operator=()長什麼樣子? 12/10 23:46
5F:→ dryman:理論上這個*this應該就是li才對... 12/10 23:46
iterator& operator = (const iterator& i){ if (ARR_CAPACITY(_his)!=ARR_CAPACITY(i._his)){ delete[]_his; _his = new HisNode<T>[ARR_CAPACITY(i._his)]; } for (_pos = 0; _pos <= i._pos; ++_pos) _his[_pos] = i._his[_pos]; --_pos; _dummy = i._dummy; return *this; } 沒有寫註解可能會有點難看懂.. 不過我檢查過從=出來的*this和在constructor的*this內容都是正確的 尤其是constructor的*this是正確的最為詭異 因為那個*this不是應該就是li本身嗎? 125 AdtType<AdtTestObj>::iterator li = _container.begin(); ※ 編輯: dryman 來自: 114.45.169.1 (12/10 23:49) 補充詭異點之二:127行會被自動略過.. 我將125,126行位置對調,以測試adtTest是不是有一起被complie而不只是物件 Breakpoint 1, AdtTest::getPos (this=0x80597f8, pos=0) at adtTest.h:124 124 size_t i = 0; (gdb) l 119 120 #ifdef RANDOM_ACCESS 121 if (pos >= _container.size()) return _container.end(); 122 return (_container.begin() + pos); 123 #else 124 size_t i = 0; 125 AdtType<AdtTestObj>::iterator lj = _container.end(); 126 AdtType<AdtTestObj>::iterator li = _container.begin(); 127 while ((li != lj) && (i++ != pos)) ++li; 128 return li; (gdb) n 125 AdtType<AdtTestObj>::iterator lj = _container.end(); (gdb) 126 AdtType<AdtTestObj>::iterator li = _container.begin(); (gdb) 128 return li; 超毛的,127行gdb怎麼完全沒有去動!! 通常不都應該是先列印出127行 然後next後會顯示記憶體區段錯誤之類的嗎? 結果居然被完全省略掉了..<囧> ※ 編輯: dryman 來自: 114.45.169.1 (12/10 23:56) ※ 編輯: dryman 來自: 114.45.169.1 (12/10 23:57) ※ 編輯: dryman 來自: 114.45.169.1 (12/10 23:58)
6F:推 timrau:不負責任猜測:iterator::operator=()裡面 12/11 00:02
7F:→ timrau:delete[] _his;前請先檢查if(NULL != _his) 12/11 00:03
8F:→ timrau:BTW,如果是我會用constructor來實做operator=()而非相反 12/11 00:04
9F:→ timrau:真的搞不定就valgrind跑一發,先把warning/error清乾淨再說 12/11 00:04
10F:推 ric2k1:copy constructor 裏面又有 *this = li... 恐怕會掛吧! 12/11 00:06
11F:→ ric2k1:請做 member-wise 的 assignment... 12/11 00:06
12F:推 timrau:這裡湊巧是丟reference進去丟reference出來 不然早就 12/11 00:08
13F:→ timrau:無窮遞迴了吧 @@ 12/11 00:09
14F:推 ric2k1:我還是覺得應該是不行,compile 沒有 warning 嗎? 12/11 00:10
15F:推 timrau:我覺得compile不會有問題,多少default constructor 12/11 00:11
16F:→ timrau:都是寫個initialize();了事也活得好好的.... 12/11 00:12
17F:→ dryman:compile沒有error..我試試看將constructor來做= 12/11 00:16
18F:→ dryman: 用 12/11 00:17
copy constructor 改成 iterator(const iterator& i): _dummy(false) { _his = new HisNode<T>[ARR_CAPACITY(i._his)]; for (_pos = 0; _pos <= i._pos; ++_pos) _his[_pos] = i._his[_pos]; --_pos; _dummy = i._dummy; } 還是沒有用.. li還是垃圾,127行也是直接略過 orz||| ※ 編輯: dryman 來自: 114.45.169.1 (12/11 00:22)
19F:推 ric2k1:我的意思是: iterator(...i):_pos(i.pos), _dummy(false), 12/11 00:21
20F:→ ric2k1:_his(i._his) { ....} ^_pos 12/11 00:21
21F:推 ric2k1:然後裡面不要在 *this = i 12/11 00:21
22F:推 ric2k1:cout 大法搬出來,看它到底呼叫了什麼東西... 12/11 00:29
23F:→ dryman:_his是一個陣列,所以用老師的方法好像不太容易改.. 12/11 00:29
24F:推 ric2k1:不過你的 copy constructor 的定義好奇怪,跟一般的 = 的意 12/11 00:30
25F:→ dryman:_his(i.his)的部份 12/11 00:30
26F:→ ric2k1:思不同,會讓 code 變得比較不直觀... 12/11 00:30
27F:→ dryman:因為要把整個_his <-history的陣列一起複製的關係.. 12/11 00:34
28F:推 timrau:還是懷疑memory被寫爛了.......導致code亂跳 這是有可能的 12/11 00:48
29F:推 Neilhahaha:陣列不能直接複製嗎? 我覺得問題應該就是教授說的那樣 12/11 00:52
30F:推 Neilhahaha:*this=i會再跑去叫overload=感覺就蠻怪的 12/11 00:54
31F:→ dryman:所以我就改成沒有用*this=i的版本了呀.. 12/11 00:58
32F:→ dryman:我也覺得應該是哪裡memory出問題,不過最囧的就是 12/11 00:59
33F:→ dryman:不知道為什麼還在copy constructor裡面時*this是正確的.. 12/11 00:59
34F:推 ric2k1:ARR_CAPACITY(i._his) 是多少啊? 覺得你的 array copy 怪 12/11 01:06
35F:→ ric2k1:怪的... _pos 最好是 pass-the-end,否則一開始它是要指到 12/11 01:07
36F:→ ric2k1:哪裡? 12/11 01:07
我的_his是一個dynamic array 這裡的ARR_CAPACITY呼叫的是array前紀錄大小的那一塊 改用cout大法後,發生很怪異的事..就是li居然印出了正確的值(翻桌) Constructing li.. In copy constructor.._pos = 1 data is 394 li._pos = 1 In copy constructor.._pos = 1 data is 911 In copy constructor.._pos = 1 data is 394 (我把end(),begin()的順序又換了回來,911的那個是copy end的部份) 當然在下一行它還是掛掉了 不過感覺像是gdb沒有正確的抓到值...有沒有這麼誤導的啊 囧 ※ 編輯: dryman 來自: 114.45.169.1 (12/11 01:17)
37F:→ dryman:超級大烏龍..(翻) 不過下一行我print ++都沒事這裡會掛 12/11 01:19
38F:→ dryman:也很奇怪就是了.. 12/11 01:20
39F:推 Neilhahaha:所以OK了? 12/11 01:21
40F:→ dryman:no... 12/11 01:34
我記得上課有上過 iterator operator ++(int) 應該是只有在li++的時候才會呼叫到 可是我從頭到尾都只有用++it,卻會呼叫到++(int) (我用了cout大法來確認) 這..怎麼會這麼奇怪.. 它應該是掛在++li的地方,繼續cout檢查中.. ※ 編輯: dryman 來自: 114.45.169.1 (12/11 01:40)







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP