0

天候をシミュレートするためのパーティクル システムを作成しています。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 を返します。

4

1 に答える 1

0

私はあなたが変わる必要があると思います

 while(it!=end)

 while(it!=particles.end())

end動的な値です。要素を削除すると変化します。

于 2013-09-20T21:19:41.100 に答える