从std :: vector中删除项目时“迭代器不可递增”

时间:2017-08-18 09:48:02

标签: c++ c++11 vector visual-studio-2015 sdl

我目前正在使用SDL2和C ++开发游戏。

我的角色射击子弹,当然当其中一个击中敌人时,它必须从他所在的std :: vector中删除。

我的子弹矢量声明如下

std::vector<Bullet> _bullets;

当我尝试从中删除一个时,我会执行以下操作

void Player::DestroyBullet(Bullet b)
{
    for (auto it = _bullets.begin(); it != _bullets.end();)
    {
        if ((*it).GetId() == b.GetId())
        {
            it = _bullets.erase(it);
        }
        else
        {
            ++it;
        }
    }
}

现在的问题是,在擦除那个子弹时,编译器给我一个断言失败,它说“表达式:向量迭代器不可递增”。

我搜索了一些不同的解决方案来从一个向量中删除一个项目(使用迭代器,使用pop_back与其他一些函数混合),但它们都没有工作。这个向量当然是由游戏循环中的其他函数使用(绘图函数,它连续迭代它来绘制子弹纹理和更新函数,它负责所有逻辑)。

这些功能可能会引发这个问题吗?这很奇怪,因为它们(当然)使用不同的循环器迭代器,因此它们不应该关心它。

P.S。我正在使用Visual Studio 2015进行编程。

编辑1:应用程序 NOT 多线程。

编辑2:有点晚了但我几个月前发现在GCC上这个问题不存在。它只发生在Visual CPP编译器上。

1 个答案:

答案 0 :(得分:0)

您应该使用::std::remove_if代替:

_bullets.erase
(
    ::std::remove_if
    (
        _bullets.begin()
    ,   _bullets.end()
    ,   [&b](Bullet const & bullet)
        {
            return (bullet.GetId() == b.GetId());
        }
    )
,   _bullets.end()
);