2011-07-31 2 views
-1

Извините, если это звучит как «Он компилируется, поэтому он должен работать!» вопрос, но я хочу понять, почему что-то происходит (или не происходит, в зависимости от обстоятельств).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, которому принадлежат элементы, которые он итерации. Это и вызывает ошибку.

+0

@SethCarnegie let [продолжить эту дискуссию в чате] (http://chat.stackoverflow.com/rooms/1994/discussion-between-merlyn-morgan-graham-and-seth-carnegie) –

ответ

4

Ваш вопрос не отвечает без кода, чтобы воспроизвести проблему.

Но дать неопределенный ответ на вашу общую проблему. Если компилятор или отладчик обнаружил проблему, у вас, вероятно, есть одна.

В C++, только потому, что что-то «идет не так», не означает, что ваша программа выйдет из строя - она ​​может продолжать работать с совершенно непредсказуемыми результатами. Он может даже выполнить желаемые результаты. Но только потому, что он хорошо работает в вашей системе, он не дает вам никаких гарантий для других систем, компиляторов, времени суток или даже для дополнительных прогонов той же программы.

Это называется undefined behavior и вызвано неправильным использованием языка (но не таким способом, который вызывает сбой компиляции). Переполнение буфера является лишь одним из десятков примеров.

+0

посмотреть, есть ли дополнительная информация в моем редактировании помогает вообще - если нет, скажите так, и я постараюсь предоставить больше. –

+0

Отредактировано снова с дополнительной информацией. –

+0

@Seth: дело в том, чтобы добавить крошечный код, который демонстрирует проблему (может быть, не ваш реальный код), и добавить ответ на свой вопрос, который показывает * почему *, что вызывает проблему. Мой ответ не отвечает на ваш конкретный вопрос ... –

1

Оказалось, что что-то не так с моей установкой Visual Studio, поэтому переустановка исправлена.

Смежные вопросы