C ++访问冲突尝试从向量中擦除时读取位置0x003AE000

时间:2013-12-22 11:52:54

标签: c++ vector

当我尝试从向量中删除项目时,如果项目被布尔值设置为不活动,则会出现错误。我试过在网上搜索但是没有找到任何关于它的信息。我试图找到不同的方法来删除矢量中索引x上的元素,并找到函数:vector.erase(vector.begin()+ index)

因此,当我尝试在for循环中使用它时,我的访问冲突读取位置指向擦除功能行。

错误所在的循环代码:

    if (!player.getBullets().empty())
    {
        for (int x = 0; x < player.getBullets().size(); x++)
        {
            //Check for projectiles whos status is dead.
            if (!player.getBullets()[x]->getAlive())
            {
                //Erase the element at position x.
                player.getBullets().erase(player.getBullets().begin() + x);

            }
        }
    }

3 个答案:

答案 0 :(得分:2)

不要重新发明轮子,特别是不能在水下和墙壁上进行的非常困难的轮子。使用现成的:

#include <algorithm>

player.getBullets().erase(
    std::remove_if(player.getBullets().begin(),
                   player.getBullets().end(),
                   [](Projectile * p) -> bool { return !p->getAlive(); }),
    player.getBullets().end());

(我假设Bulletdecltype(player.getBullets())::value_type相同,即项目符号容器的元素类型。调整以适应。)

答案 1 :(得分:0)

如果使用迭代器而不是索引,则更容易擦除。 (几乎)直接转换代码:

vector<Projectile*> bullets = player.getBullets();

for (vector<Projectile*>::iterator x = bullets.begin(); x != bullets.end(); )
{
    //Check for projectiles whos status is dead.
    if (!(*x)->getAlive())
    {
        //Erase the element at position x.
        x = bullets.erase(x);
    }
    else
    {
        ++ x;
    }
}

请注意,这仅适用于矢量的本地副本。如果要更新播放器类本身中的向量,则需要更改getBullets以返回引用:

vector<Projectile*> &Sprite::getBullets()
{
    return bullets;
}

然后循环:

vector<Projectile*> &bullets = player.getBullets();

答案 2 :(得分:0)

虽然循环无效,因为计数器x增加而向量的大小减小,结果并非遍历所有向量,但我没有看到访问冲突的原因。我认为问题与存储在矢量中的对象有关。