推 Neilhahaha:142的*this=i刪掉看看? 12/10 23:40
→ dryman:不行啊..那樣*this內容就沒被改到了 12/10 23:45
→ dryman:那樣的話*this裡就都是垃圾了.. 12/10 23:45
推 timrau:iterator::operator=()長什麼樣子? 12/10 23:46
→ 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)
推 timrau:不負責任猜測:iterator::operator=()裡面 12/11 00:02
→ timrau:delete[] _his;前請先檢查if(NULL != _his) 12/11 00:03
→ timrau:BTW,如果是我會用constructor來實做operator=()而非相反 12/11 00:04
→ timrau:真的搞不定就valgrind跑一發,先把warning/error清乾淨再說 12/11 00:04
推 ric2k1:copy constructor 裏面又有 *this = li... 恐怕會掛吧! 12/11 00:06
→ ric2k1:請做 member-wise 的 assignment... 12/11 00:06
推 timrau:這裡湊巧是丟reference進去丟reference出來 不然早就 12/11 00:08
→ timrau:無窮遞迴了吧 @@ 12/11 00:09
推 ric2k1:我還是覺得應該是不行,compile 沒有 warning 嗎? 12/11 00:10
推 timrau:我覺得compile不會有問題,多少default constructor 12/11 00:11
→ timrau:都是寫個initialize();了事也活得好好的.... 12/11 00:12
→ dryman:compile沒有error..我試試看將constructor來做= 12/11 00:16
→ 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)
推 ric2k1:我的意思是: iterator(...i):_pos(i.pos), _dummy(false), 12/11 00:21
→ ric2k1:_his(i._his) { ....} ^_pos 12/11 00:21
推 ric2k1:然後裡面不要在 *this = i 12/11 00:21
推 ric2k1:cout 大法搬出來,看它到底呼叫了什麼東西... 12/11 00:29
→ dryman:_his是一個陣列,所以用老師的方法好像不太容易改.. 12/11 00:29
推 ric2k1:不過你的 copy constructor 的定義好奇怪,跟一般的 = 的意 12/11 00:30
→ dryman:_his(i.his)的部份 12/11 00:30
→ ric2k1:思不同,會讓 code 變得比較不直觀... 12/11 00:30
→ dryman:因為要把整個_his <-history的陣列一起複製的關係.. 12/11 00:34
推 timrau:還是懷疑memory被寫爛了.......導致code亂跳 這是有可能的 12/11 00:48
推 Neilhahaha:陣列不能直接複製嗎? 我覺得問題應該就是教授說的那樣 12/11 00:52
推 Neilhahaha:*this=i會再跑去叫overload=感覺就蠻怪的 12/11 00:54
→ dryman:所以我就改成沒有用*this=i的版本了呀.. 12/11 00:58
→ dryman:我也覺得應該是哪裡memory出問題,不過最囧的就是 12/11 00:59
→ dryman:不知道為什麼還在copy constructor裡面時*this是正確的.. 12/11 00:59
推 ric2k1:ARR_CAPACITY(i._his) 是多少啊? 覺得你的 array copy 怪 12/11 01:06
→ ric2k1:怪的... _pos 最好是 pass-the-end,否則一開始它是要指到 12/11 01:07
→ 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)
→ dryman:超級大烏龍..(翻) 不過下一行我print ++都沒事這裡會掛 12/11 01:19
→ dryman:也很奇怪就是了.. 12/11 01:20
推 Neilhahaha:所以OK了? 12/11 01:21
→ dryman:no... 12/11 01:34
我記得上課有上過
iterator operator ++(int)
應該是只有在li++的時候才會呼叫到
可是我從頭到尾都只有用++it,卻會呼叫到++(int) (我用了cout大法來確認)
這..怎麼會這麼奇怪..
它應該是掛在++li的地方,繼續cout檢查中..
※ 編輯: dryman 來自: 114.45.169.1 (12/11 01:40)