MSVC ++ говорит, что стек вокруг переменной поврежден, но программа работает - PullRequest
0 голосов
/ 31 июля 2011

Извините, если это звучит как "Он компилируется, поэтому он должен работать!" вопрос, но я хочу понять, почему что-то происходит (или не происходит, в зависимости от обстоятельств).

В настройках проекта я установил 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, которому принадлежат элементы, которые он повторяет. Это то, что вызывает ошибку.

Ответы [ 2 ]

4 голосов
/ 31 июля 2011

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

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

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

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

1 голос
/ 02 августа 2011

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

...