Удаление указателя объекта из вектора

Я пишу некоторую систему частиц для имитации погоды. Я использую 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 и g++. Если частица может быть восстановлена, она просто регенерирует себя, как Доктор в своей функции обновления, поэтому isDead возвращает false.


person user2800697    schedule 20.09.2013    source источник


Ответы (1)


Я думаю, тебе нужно изменить

 while(it!=end)

to

 while(it!=particles.end())

end — это динамическое значение. Он меняется, если вы удаляете элемент.

person Mark Lakata    schedule 20.09.2013
comment
работает нормально;) Я трачу несколько часов на обнаружение и попытки исправить это :) Я никогда не ожидал, что конец - это проблема, также я был уверен, что пересекаю конец вектора. - person user2800697; 21.09.2013