Как уже отмечали другие, сбой происходит из-за недействительного итератора, который вы продолжаете использовать после вызова va.erase()
.
Теперь о том, почему он работает в режиме Release, заключается в том, что в некоторых случаях итератор для std::vector<>
в режиме Release является простым указателем на динамически размещенный массив. Когда вы вызываете стирание, итератор продолжает указывать на тот же элемент массива, в то время как содержимое массива было перемещено функцией erase
. Это неопределенное поведение и специфическая реализация стандартной библиотеки, но очень распространенное. Ни при каких обстоятельствах не следует полагаться на поведение переносимого кода.
Однако в некоторых реализациях стандартной библиотеки итераторы режима отладки выполняют проверку и являются более сложными, чем простые указатели. Таким образом, они могут обнаружить, что вы делаете что-то, что не является законным и преднамеренно вызывает сбой, так что вы можете распознать вашу ошибку.