看板 EE_DSnP 關於我們 聯絡資訊
前情提要.. 在AdtTest::getPos中,我的程式會在while那一行掛掉 size_t i = 0; cout << "Constructing li.." << endl; AdtType<AdtTestObj>::iterator li = _container.begin(); AdtType<AdtTestObj>::iterator lj = _container.end(); while ((li != lj) && (i++ != pos)) { cout << "Going to ++li..." << endl; ++li; cout << "++li.." << endl; } 用gdb追蹤,會發現li根本沒被指定為begin()的值 p li裡面是垃圾..囧 可是用cout大法的話li的值是正確的.. 所以後來我就想會不會是copy constructor或是 operator != 的地方出錯 我在"要離開"constructor和operator != 的地方都cout adt> adta -r 5 adt> adtd -r 5 In copy constructor.._pos = 1 data is 394 in ++().. In operator !=783 911 in ++().. In operator !=798 911 in ++().. In operator !=840 911 in ++().. In operator !=911 911 in ++().. In operator !=911 911 Constructing li.. In copy constructor.._pos = 1 data is 394 In copy constructor.._pos = 1 data is 911 In operator !=394 911 In copy constructor.._pos = 1 data is 394 Command terminated Command terminated 見鬼了...為什麼會去呼叫copy constructor啊!!! while ((li != lj) && (i++ != pos)) { cout << "Going to ++li..." << endl; ++li; cout << "++li.." << endl; } 沒有任何東西會去呼叫copy constructor啊!? ++()和++(int)我都有加cout來看是否被呼叫 看起來還沒碰到++li就噴掉了 只是..為什麼會多一個copy consturctor... 到底是哪來的?(抱頭) 更新: 我想測試到底是在while的哪裡掛掉 所以將while分成兩半,一半放到while裡用if+break來取代 結果發現很不可思議的事: while(++i != pos)會掛掉!! 如果把++i給完全去掉的話就沒事 也就是說只有while(li!=lj)的話,程式會執行到刪除重複的點才掛掉 我將程式改成 AdtType<AdtTestObj>::iterator getPos(size_t pos) { #ifdef RANDOM_ACCESS if (pos >= _container.size()) return _container.end(); return (_container.begin() + pos); #else size_t i = 0; cout << "Constructing li.." << endl; AdtType<AdtTestObj>::iterator li = _container.begin(); AdtType<AdtTestObj>::iterator lj = _container.end(); while ( li != lj){ cout << *li; if (i++ == pos) break; cout << "Going to ++li..." << endl; ++li; cout << "++li.." << endl; } return li; #endif // RANDOM_ACCESS } 輸出的結果則會是: Constructing li.. In copy constructor.._pos = 1 data is 394 In copy constructor.._pos = 1 data is 911 In operator !=394 911 394In copy constructor.._pos = 1 data is 394 Command terminated 394是cout << *li;的結果 最詭異的就是i明明就不是iterator, pos也不是 卻會呼叫copy constructor.. 這實在是太邪門了啊.. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.45.169.1 ※ 編輯: dryman 來自: 114.45.169.1 (12/11 09:56)
dryman:再更新:我多加了一個cout在if(i++==pos) 前面 12/11 10:02
dryman:這樣的話這行cout還是會印出來,而copy constructor 12/11 10:02
dryman:是在這行cout後面被呼叫.. 12/11 10:03
dryman:確認掛掉點了..在return li的時候掛的 12/11 10:08
keyboardle:為什麼聽起來很像是i被當成li了.... 12/11 10:12
ric2k1:return li 是會呼叫 copy constructor 給 return 的 object 12/11 11:41
dryman:看來是丟到erase的地方爆掉的..真是腦包sigh.. 12/11 12:32
dryman:總之,謝謝老師還有各位強者的提示^ ^ 12/11 12:41