Извините, если это звучит как «Он компилируется, поэтому он должен работать!» вопрос, но я хочу понять, почему что-то происходит (или не происходит, в зависимости от обстоятельств).MSVC++ говорит, что стек вокруг переменной поврежден, но работает программа
В настройках проекта я установил Basic Runtime Checks
в Both
. Отладчик сообщает мне, что:
Ошибка проверки времени выполнения # 2 - Обтекание переменной «beg» было повреждено.
Но если я устанавливаю его по умолчанию, то есть нет, программа запускается и завершается нормально, не вызывая никаких исключений и не вызывая ошибок.
Мой вопрос: могу ли я смело игнорировать это (потому что MSVC++ может быть как-то не так) или это настоящая проблема? Я не вижу, как программа может продолжаться успешно, когда стек был запутан.
Edit:
Функция, которая вызывает эту ошибку выглядит точно так же, как это: приращений
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 брейки ++, он указывает до закрытия }
.
Edit 2:
Я изолировали проблему. В некоторых ситуациях fun
удаляет некоторые элементы из list
, которому принадлежат элементы, которые он итерации. Это и вызывает ошибку.
@SethCarnegie let [продолжить эту дискуссию в чате] (http://chat.stackoverflow.com/rooms/1994/discussion-between-merlyn-morgan-graham-and-seth-carnegie) –