如何在for循环中擦除向量中的对象时,如何防止出现分段错误?

use*_*136 3 c++ oop for-loop vector

[编辑2]这可能是因为表面在被其他对象仍在使用时被释放...所以我想写它,所以只有在屏幕上没有更多的对象时它才被释放.

[编辑] [更新]我修复了代码以使用迭代器,我仍然遇到同样的问题...我刚刚确认这是对象的析构函数的问题.在类中,析构函数调用SDL_FreeSurface(image); 从内存中释放对象的图像...但是使用复制构造函数创建的对象显然不适合.我需要做些什么才能使用复制构造函数创建的对象正常工作?我似乎无法在Google上找到与此有关的任何内容.

数字是指给定时间屏幕上的项目符号数量...我有一个对象"bullet"的向量(向量项目符号;)...代码检查触发按钮(z)是否已关闭,并添加如果它是向量的新子弹.然后它更新(移动,blits),然后检查子弹是否在屏幕的末端......一切正常,直到子弹到达屏幕的末端,它应该被销毁.

if (trigger)
{
  bullet.push_back(Bullet(position.x, position.y));
  ++number;
}

for(int i = 0; i < bullet.size(); i++)
{
  bullet[i].update();
}
Run Code Online (Sandbox Code Playgroud)

下面是问题所在...当一个子弹对象被删除时,程序退出时出现分段错误...现在,我明白为什么会发生这种情况,因为矢量大小在循环中被改变了,但我可以' t弄清楚如何修复它...我添加了休息时认为它可以解决问题,因为无论如何只有一个子弹在给定时间<= 0但是它没有...我最初有if语句在更新函数之后的最后一个for循环中,但我把它放在它自己的for循环中,所以我可以使用break.

for(int i = 0; i < bullet.size(); i++)  
{
  if (bullet[i].position.y <= 0)
  {     
    bullet.erase(bullet.begin() + i);
    --number;
    break;
  }
}
Run Code Online (Sandbox Code Playgroud)

我是向量的新手,所以如果我不明白或者我犯了n00b错误,请在这里忍受.

Ker*_* SB 11

序列容器的标准擦除循环如下:

for (std::vector<Bullet>::iterator it = v.begin(); it != v.end() /* not hoisted */; /* no increment */)
{
    if (delete_condition)
    {
        it = v.erase(it);
    }
    else
    {
        ++it;
    }
}
Run Code Online (Sandbox Code Playgroud)

迭代器的使用优于使用计数索引,因为它使您的代码从计数器算术中解放出来,这对代码的清晰度没有任何影响,而且非常麻烦,而这里提供的迭代器版本是相当不言自明的.

关键是不要在发生的情况下增加循环变量erase.

你可能也想看看这个remove/erase成语:

v.erase(std::remove_if(v.begin(), v.end(),
                       [](Bullet & b) -> bool { return delete_condition }),
        v.end());
Run Code Online (Sandbox Code Playgroud)