Если this
является единственным элементом в списке, вы переполните конец списка.
После удаления this
из списка вы сбрасываете it = m_DriverList.begin();
. Это отлично. Затем вычисляется выражение цикла (i++
из оператора for
), в результате чего it
продвигается выше конца диапазона.
Продвижение итератора после конца контейнера приводит к тому, что программа демонстрирует неопределенное поведение. Последние версии Visual C ++ помогают обнаружить многие распространенные ошибки итераторов в отладочных сборках вашей программы и выдвигают утверждения, помогающие вам их решить.
Вы можете решить проблему, удалив выражение цикла и переместив его в оператор else
:
while (it != m_DriverList.end())
{
if (it->second == this)
{
m_DriverList.erase(it);
it = m_DriverList.begin();
}
else
{
++it;
}
}
Хотя перезапуск итерации при каждом удалении элемента довольно расточителен. Вместо этого рассмотрим использование итератора, возвращаемого вызовом erase
:
it = m_DriverList.erase(it);