从矢量中删除对象指针

时间:2013-09-20 21:15:05

标签: stl system particles

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

1 个答案:

答案 0 :(得分:0)

我认为你需要改变

 while(it!=end)

 while(it!=particles.end())

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