Getting this error while trying to erase the last element of a list. I debugged the code and was able to figure out what causes it and where, here’s my code:
for(Drop_List_t::iterator i = Drop_System.begin(); i != Drop_System.end() && !Drop_System_Disable; /**/)
{
if(Player->BoundingBox.Intersect(&(*i)->BoundingBox))
{
i = Drop_System.erase(i);
}
++i; //List iterator crashes here if last entry was deleted
}
I can’t figure out what I’m doing wrong… Any suggestions?
Your algorithm is flawed because you did not understood what
erasereturned.When you use
erase, it removes the element pointing to by the iterator, and returns an iterator to the next element.If you wish to iterate over all elements of a list, it means that whenever
erasewas used you should not further increment it.This is the normal code you should have gotten:
And this neatly solves the issue you are encountering! Because when you
erasethe last element,erasewill return the same iterator asend, that is an iterator pointing one-past-the-last element. This iterator shall never be incremented (it may be decremented if the list is not empty).