我有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]
一样?
答案 0 :(得分:7)
如果没有看到更多代码,我不确定这是否是问题,但是bullet.hit()
中的代码是通过添加元素来更改向量的吗?如果是,并且您使用iterator
对其进行迭代,则该迭代器将失效,并且将来对其进行任何解引用将导致未定义的行为。但是,使用基于标准int
的for循环不会出现此问题,因为索引的访问不会失效。
希望这有帮助!