我正在编写一些粒子系统来模拟天气。我使用std :: vector来存储粒子。当粒子死亡(并且无法恢复)时,我只需擦除它。所以,我有这样的功能:
void update(float dt){
std::vector<PatriclePtr>::iterator it(particles.begin());
std::vector<PatriclePtr>::iterator end(particles.end());
while(it!=end){
(*it)->update(dt);
if((*it)->isDead()){
ParticlePtr p = (*it);
it = particles.erase(it);
delete p;
p = NULL;
continue;
}
}
it++;
}
它非常好用。但我有一些问题,我不明白。我给了一些printf,它告诉我当前粒子的地址。当我擦除向量中的最后一个粒子然后程序尝试按顺序更新他并崩溃。它看起来像
//--------Start updating particles------------
Update particle 11928076.
Update particle 11087264. Removed! //it's ok
Update particle 10384873.
Update particle 12764599. Removed! //last one will be crash
Update particle 12764599.
Core dumped.
只有当粒子12764599是向量中的最后一个粒子时才会发生。我试过发现任何错误,但我不能。我做错了什么?你有什么主意吗? 我正在使用Fedora Linux OS和g ++。如果粒子可以恢复,它就像她的更新函数中的Doctor一样重新生成,所以isDead返回false。
答案 0 :(得分:0)
我认为你需要改变
while(it!=end)
到
while(it!=particles.end())
end
是动态值。如果删除元素,它会改变。