作者dryman (dryman)
看板EE_DSnP
標題Re: [問題] 掛在非常奇怪的地方
時間Fri Dec 11 09:28:37 2009
前情提要..
在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