遍历矢量会导致错误,但循环的标准不会

Iterating through a vector cause error but standard for-loop does not

本文关键字:循环 标准 错误 遍历      更新时间:2023-10-16

我有一个vector,它保存指向抽象类型Rock:的指针

vector<Rock*> rocks;

如果我用迭代器循环遍历向量,然后尝试通过迭代器访问对象(一个扩展Rock的非抽象类),我会在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]那样通过迭代器传递向量中对象的引用?

在没有看到更多代码的情况下,我不确定这是否是问题所在,但bullet.hit()中的代码是否通过添加元素来改变矢量?如果是,并且您正在使用iterator对其进行迭代,则该迭代器将失效,并且将来对它的任何取消引用都将导致未定义的行为。然而,使用标准的基于int的for循环不会有这个问题,因为通过索引进行的访问不能无效。

希望这能有所帮助!