【发布时间】:2017-12-19 22:43:57
【问题描述】:
我正在遍历矢量std::vector<Bullet*> bullets,并且正在寻找与敌人的碰撞。它在任何情况下都很好用,除了以下情况:最后发射的子弹(必须不止一个)与敌人相撞。
代码-
for(std::vector<Bullet*>::iterator it = bullets.begin(); it != bullets.end(); ++it)
{
if ((*it)->getSprite()->getGlobalBounds().intersects(enemy->getSprite()->getGlobalBounds()))
{
delete *it;
bullets.erase(it);
enemy->destroy();
if (bullets.size() == 0)
break;
}
}
我在for 循环中注释了特定元素,发现bullet.erase(it) 调用使程序崩溃。
当崩溃发生时,我收到一个返回码:134 (0x86)。这段代码有什么问题?
(*it)->getSprite() 从Bullet 类返回一个指向精灵的指针。
【问题讨论】:
-
std::vector::erase使迭代器无效,使++it在调用erase之后,出现未定义的行为。 -
为什么不
std::vector::pop_back() -
我试图做这样的事情: if (std::next(it) == bullets.end()) bullets.pop_back();否则子弹.擦除(它);但它似乎也不起作用。
-
无论
it是否引用最后一个元素,这段代码都表现出未定义的行为。bullets.erase(it); ++it;序列无论哪种方式都无效。如果它看起来有效,那只是偶然。您可以通过以下方式挽救它:for (iterator it = ...; ...; /* no increment */) { if (condition) { it = bullets.erase(it); } else { ++it; } } -
哦,好的,所以要清楚一点,在我之前的代码中,当我删除元素时,迭代器已经指向下一个元素,并且在下一次迭代的“for”循环中我调用了 + +它所以它指向另一个元素?在最后一个子弹的情况下,在 ++it 调用之后,它指向 bullets.end() 并导致错误?
标签: c++ memory vector crash sfml