迭代向量导致错误,但标准for循环不会

时间:2012-03-30 01:38:10

标签: c++ loops stl vector iterator

我有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]一样?

1 个答案:

答案 0 :(得分:7)

如果没有看到更多代码,我不确定这是否是问题,但是bullet.hit()中的代码是通过添加元素来更改向量的吗?如果是,并且您使用iterator对其进行迭代,则该迭代器将失效,并且将来对其进行任何解引用将导致未定义的行为。但是,使用基于标准int的for循环不会出现此问题,因为索引的访问不会失效。

希望这有帮助!