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)