【问题标题】:"Iterator not incrementable" while deleting an item from std::vector从 std::vector 删除项目时“迭代器不可递增”
【发布时间】:2018-01-26 23:04:50
【问题描述】:

我目前正在使用 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 与其他一些函数混合),但它们都不起作用。这个向量当然会被游戏循环中的其他函数使用(绘图函数不断迭代它以绘制子弹纹理和更新函数,负责处理所有逻辑)。

这些函数会引发这个问题吗?这会很奇怪,因为他们(当然)为他们的循环使用不同的迭代器,所以他们不应该关心这个。

附:我正在使用 Visual Studio 2015 进行编程。

编辑 1:应用程序不是多线程的。

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

【问题讨论】:

  • 你在使用多线程吗?如果是这样,同时阅读和更新会给你带来各种各样的问题。每次操作后向量必须处于一致状态,但不是期间
  • 您在哪个语句上得到“向量迭代器不可递增”?
  • 这部分代码没问题,你肯定是别处搞错了
  • 可能是多线程问题,您所描述的错误发生在迭代器无效时,如果另一个线程将元素放入/移除该向量,则可能会发生这种情况。
  • it 指向_bullets 的第三个元素,当它进入else 并且在执行++it 之前,第三个元素从其他地方删除。然后++it被执行了。Boom。

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


【解决方案1】:

你应该改用::std::remove_if

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

【讨论】:

  • @UmNyobe remove_if 应该是首选,因为它更快。
  • 真的吗?如果您删除多个元素,它可能会更快,但在这种情况下实际发生的情况尚不清楚。
  • @VTT 我试过你的代码,但它仍然给我同样的问题(我还不得不从(Bullet const &amp; bullet) 中删除const,因为它没有编译)。这对我来说真的很头疼,不知道为什么。下面是断言失败窗口屏幕截图的链接,也许它可以提供帮助! link
  • @stack_overflower 如果这段代码不能用const 编译,那么可能是因为GetId 方法由于某种原因不是 const 限定的。并且您应该添加有关您获得此断言的确切语句的信息,可能带有堆栈跟踪。此外,此断言失败消息来自正在运行的可执行文件,而不是来自编译器。
  • @VTT 我无法从 VS 获得任何堆栈跟踪失败,我只能看到在输出窗口中有与我之前链接的屏幕截图相同的文本。对不起,当以这种方式提出断言时,也许我只是不知道如何收集有用的信息。当断言失败发生时,VS中是否有任何设置可以获取更多信息?
猜你喜欢
  • 1970-01-01
  • 2020-03-10
  • 2014-05-24
  • 1970-01-01
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
相关资源
最近更新 更多