我正在编写一些粒子系统来模拟天气。我使用 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。