Извините, если это звучит как "Он компилируется, поэтому он должен работать!" вопрос, но я хочу понять, почему что-то происходит (или не происходит, в зависимости от обстоятельств).
В настройках проекта я установил Basic Runtime Checks
на Both
. Отладчик сообщает мне, что:
Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'beg' был поврежден.
Но если я установлю его по умолчанию, которого нет, программа запускается и завершается нормально, не выдает никаких исключений и не вызывает ошибок.
У меня вопрос: могу ли я спокойно проигнорировать это (потому что MSVC ++ может быть как-то не так) или это реальная проблема? Я не вижу, как программа может успешно продолжаться, когда стек был испорчен.
<ч />
Изменить:
Функция, вызывающая эту ошибку, выглядит примерно так:
int fun(list<int>::iterator&, const list<int>::iterator&);
int foo(list<int>& l) {
list<int>::iterator beg = l.begin();
list<int>::iterator end = l.end();
return fun(beg, end);
}
fun
увеличивает и работает на beg
, а когда возвращается, beg == end
, а когда MSVC ++ разрывается, указывает на закрытие }
.
<ч />
Редактировать 2:
Я выделил проблему. В некоторых ситуациях fun
удаляет некоторые элементы из list
, которому принадлежат элементы, которые он повторяет. Это то, что вызывает ошибку.