디버그 빌드를 사용하여 메모리 덮어쓰기를 확인하려면 먼저 디버그를 위해 프로젝트를 다시 빌드해야 합니다. 그런 다음 애플리케이션의 InitInstance 함수 시작 부분으로 이동하여 다음 줄을 추가합니다.
afxMemDF |= checkAlwaysMemDF;
디버그 메모리 할당자는 모든 메모리 할당 주위에 가드 바이트를 넣습니다. 그러나 가드 바이트는 변경되었는지가 확인된 경우(메모리 덮어쓰기를 나타냄) 외에는 유용하지 않습니다. 확인된 경우에는 실제로 메모리 덮어쓰기를 수행할 수 있는 버퍼를 제공합니다.
checkAlwaysMemDF를 켜면 AfxCheckMemory 또는 new를 호출할 때마다 MFC에서 delete 함수를 호출하도록 합니다. 메모리 덮어쓰기가 검색되면 다음과 유사한 추적 메시지를 생성합니다.
Damage Occurred! Block=0x5533
관련 메시지 중 하나가 표시되면 코드를 단계별로 실행하여 손상이 발생한 위치를 확인해야 합니다. 메모리 덮어쓰기가 발생한 위치를 더 정확하게 격리하려면 직접 AfxCheckMemory를 명시적으로 호출할 수 있습니다. 예시:
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
첫 번째 ASSERT가 성공하고 두 번째 ASSERT가 실패한 경우 두 호출 사이의 함수에서 메모리 덮어쓰기가 발생했음을 의미합니다.
애플리케이션의 특성에 따라서는 afxMemDF로 인해 프로그램이 너무 느리게 실행되어 테스트할 수 없음을 확인할 수도 있습니다.
afxMemDF 변수로 인해 new 및 delete를 호출할 때마다 AfxCheckMemory가 호출됩니다. 이 경우 위에 표시된 대로 AfxCheckMemory() 호출을 분산하고 해당 방식으로 메모리 덮어쓰기를 격리해야 합니다.