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++ 。如果粒子可以恢复,它只是像 Doctor 在她的更新函数中一样重新生成自己,所以 isDead 返回 false。

4

1 回答 1

0

我认为你需要改变

 while(it!=end)

 while(it!=particles.end())

end一个动态值。如果你删除一个元素,它会改变。

于 2013-09-20T21:19:41.100 回答