2012-03-30 53 views
5

我有一個vector持有指針抽象類型Rock迭代通過向量原因錯誤,但標準的for循環不

vector<Rock*> rocks; 

如果通過與迭代器的矢量,然後我循環試圖訪問對象通過迭代(即延伸Rock一個非抽象類),I XCode中4得到一個「EXC_BAD_ACCESS」錯誤:

vector<Rock*>::iterator rockIter; 
for (rockIter = rocks.begin(); rockIter != rocks.end(); ++rockIter) 
{ 
    bullet.hit(*(*rockIter)); 
} 

但是通過它通常喜歡循環是沒有問題:

for (int i = 0; i < rocks.size(); i++) 
{ 
    bullet.hit(*rocks[i]); 
} 

功能hit()看起來像:

bool Bullet::hit(Rock & rock) 

我認爲*(*rockIter)*rock[i]會做同樣的事情,但他們顯然不。有什麼不同,以及如何通過迭代器傳遞矢量中對象的引用,就像我使用*rock[i]一樣?

+0

值得一提的是,你會想使用智能指針的矢量而不是原始指針。他們讓你的生活變得更加輕鬆。 – chris 2012-03-30 02:39:10

回答

7

沒有看到更多的代碼我不確定這是否是問題,但是bullet.hit()中的代碼是通過添加元素來更改矢量的?如果是,並且您正在使用iterator迭代它,則該迭代器將失效,並且將來的任何解除引用都將導致未定義的行爲。但是,使用基於標準int的for循環不會有這個問題,因爲按索引訪問不會失效。

希望這會有所幫助!

+1

啊謝謝你!這是問題。來自'hit()'中調用的函數的很多層存在向量的變化,我完全忘了它! – 2012-03-30 01:47:53