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

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

afxMemDF |= checkAlwaysMemDF;

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

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

Damage Occurred! Block=0x5533

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

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

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

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

См. также

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