Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы использовать отладочную сборку для проверки перезаписи памяти, сначала необходимо перестроить проект для отладки. Затем перейдите в начало функции InitInstance
приложения и добавьте следующую строку:
afxMemDF |= checkAlwaysMemDF;
Механизм распределения отладочной памяти разместит защитные байты вокруг всех выделений памяти. Однако эти защитные байты будут бесполезны, если не проверить, были ли они изменены (что указывало бы на перезапись памяти). В противном случае у вас просто будет буфер, который, на самом деле, может позволить избежать перезаписи памяти.
Если включить checkAlwaysMemDF
, MFC будет принудительно вызывать функцию AfxCheckMemory
при каждом вызове операции new
или delete
. При обнаружении перезаписи памяти будет сформировано сообщение TRACE, которое выглядит следующим образом:
Damage Occurred! Block=0x5533
Если отображается одно из этих сообщений, необходимо пошагово пройти код для определения места сбоя. Для более точного выявления места перезаписи памяти можно явным образом самостоятельно вызывать AfxCheckMemory
. Например:
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
Если первый метод ASSERT завершается успешно, а второй — нет, это означает, что в функции между двумя вызовами, видимо, произошла перезапись памяти.
В зависимости от характера приложения может оказаться, что afxMemDF
приводит к слишком медленному выполнению программы, недостаточному даже для тестирования. Переменная afxMemDF
приводит к вызову AfxCheckMemory
для каждого вызова операции создания и удаления. В этом случае следует распределить собственные вызовы AfxCheckMemory
( ), как показано выше, и попытаться таким образом изолировать перезапись памяти.