Поделиться через


Использование отладочного построения для проверки затирания памяти

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

afxMemDF |= checkAlwaysMemDF;

Механизм распределения отладочной памяти устанавливает контрольные байты для всех выделений памяти. Тем не менее, охранные байты ничего не выполняют до тех пор, пока не производится проверка их изменений (что будет являться свидетельством затирания памяти). В противном случае, это обеспечит буфер, который мог бы фактически позволить избежать затирания памяти.

При включении параметра checkAlwaysMemDF MFC будет принудительно выполнять вызов функции AfxCheckMemory при каждом вызове оператора new или delete. Если обнаружено затирание памяти, сформируется сообщение TRACE, которое будет выглядеть следующим образом:

Damage Occurred! Block=0x5533

Если появится одно из таких сообщений, необходимо будет пройтись по коду, чтобы определить, где произошло повреждение. Для более точного обнаружения места можно явно вызывать функцию AfxCheckMemory. Например:

ASSERT(AfxCheckMemory());
    DoABunchOfStuff();
    ASSERT(AfxCheckMemory());

Если первая операция ASSERT оказалась успешной, а вторая завершился неудачно, это значит, что между двумя вызовами в функции происходит затирание памяти.

В зависимости от функциональности приложения можно обнаружить, что переменная afxMemDF является причиной значительного снижения производительности программы, которая работает медленно для теста. Использование переменной afxMemDF приводит к вызову функции AfxCheckMemory при каждом вызове операторов new и delete. В этом случае следует распределить явные вызовы функции AfxCheckMemory( ), как показано выше и попытаться обнаружить затирание памяти таким образом.

См. также

Ссылки

Устранение проблем построения выпуска