2012-03-30 52 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