В деструкторе CGamePetri ошибка:
for( vector<CPetriAction *> :: iterator i = m_Messages.begin(); i != m_Messages.end(); )
{
delete *i;
m_Messages.erase( i );
}
Когда вызывается
erase
итератор становится невалидным. На практие скорее всего удаляются элементы 0, 2, 4 ... в первой половине вектора, т.к. когда удаляется нулевой элемент - первый становится нулевым, второй первым, и итератор переходит на новый первый элемент, который раньше был вторым. Решается легко:
for( vector<CPetriAction *> :: iterator i = m_Messages.begin(); i != m_Messages.end(); )
{
delete *i;
}
//m_Messages.clear(); // - в данном случае смысла нет, т.к. это деструктор
Или еще проще:
for(auto& ptr: m_Messages){
delete ptr;
}
Если в
m_Messages
хранить
unique_ptr
- тогда и этого не нужно, объекты удалятся автоматически в деструкторе вектора.