【发布时间】: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