天候をシミュレートするためのパーティクル システムを作成しています。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++ を使用しています。パーティクルを復元できる場合は、更新関数でドクターのように再生成するだけなので、isDead は false を返します。