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