Что может привести к повреждению: после нормальной ошибки блока? - PullRequest
1 голос
/ 27 апреля 2009

Я получаю эту ошибку после того, как мое приложение работает в течение 2 дней.

Мне сказали, что произошло какое-то переполнение буфера, но единственный ли это вариант?

Приложение написано на C ++ с использованием Visual C ++ 6.0.

Ответы [ 3 ]

2 голосов
/ 27 апреля 2009

Самый простой способ воспроизвести это примерно так:

//Allocate space for holding 10 ints
int *p = new int[10];

//Overwrite the memory.. doesn't crash here
p[10] = 8;

//Try to delete..crashes..
delete[] p;

Проверьте, выполняете ли вы запись в ячейку памяти за пределами выделенного пространства.

2 голосов
/ 27 апреля 2009

В отладке, когда вы получаете динамический буфер с помощью new, специальный код вставляется до и после буфера для защиты буфера.

Ex:

<Guard>=====buffer allocated on heap of required size=======<Guard>

Если вы переполните буфер, вставленная защита будет повреждена, и когда вы попытаетесь удалить буфер, отладчик подтвердит после обнаружения переполнения буфера.

Трудно найти переполнение буфера в большой кодовой базе. Я хотел бы предложить несколько способов, которые могут помочь вам обнаружить этот сценарий:

  • Использование таких инструментов, как Rational Purify :
    Это хороший инструмент для выявления повреждений памяти.
  • Отладка Windbg с помощью GFlags включено: См. Мой ответ на аналогичный вопрос здесь
0 голосов
/ 27 апреля 2009

При правильных параметрах Visual C ++ создает защитное значение в конце каждого буфера. Когда вы освобождаете буфер, он проверяет, что это все еще действует. Если нет, то возникает ошибка, которую вы видите.

Наиболее частой причиной этой ошибки является переполнение буфера. Однако это может (теоретически) быть вызвано случайной записью указателя (в конце концов, может записать в защитное значение).

Шансы, тем не менее, перерасход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...