정리

[C++] CRT Debug Heap(Memory Leak 확인 방법)

저장소/VC++

MFC 프로젝트에서는 이런거 필요 없다능...
귀찮아도 해두는 편이 좋으니까 적어둔다능... -_-;

우선 MSDN 링크
[CRT 디버그 힙] 
http://msdn.microsoft.com/ko-kr/library/aa292300(VS.71).aspx
[디버그 힙] http://msdn.microsoft.com/ko-kr/library/aa292313(VS.71).aspx

링크가 그게 그거임 -_-;
정리한 내용보다 링크가 훨 나음;;
그래도 일단 정리~


C Runtime(CRT) 환경에서 Memory Leak을 확인하는 방법은 아래와 같다.
C Runtime Library인 "crtdbg.h"를 이용하여 디버깅 중 확인할 수 있다.

#include <crtdbg.h>

#define _CRTDBG_MAP_ALLOC

#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif

근데 이 내용 MFC 책에서 봤는데... 제목이 뭐였더라;;;
아무튼 일단 저렇게 해두면 됨.
그 다음은 아래와 같다.

일단 진입부에서 아래와 같이 설정한다.
예를 들어 main() 함수가 진입 시작점일 경우

int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
...
}

이렇게 해두면 Memory Leak 발생시 MFC에서 보던 것 처럼 나온다.

각 Flag에 대한 설명은 아래와 같다.

 

비트 필드

기본값

설명

_CRTDBG_ALLOC_MEM_DF

On

디버그 할당을 사용합니다. 이 비트를 해제하면 할당은 함께 연결되어 있지만 블록 형식은 _IGNORE_BLOCK입니다.

_CRTDBG_DELAY_FREE_MEM_DF

Off

부족한 메모리 조건을 시뮬레이션하는 것과 관련해서 메모리가 실제로 해제되는 것을 방지합니다. 이 비트를 설정하면, 해제된 블록이 디버그 힙의 연결 리스트에 보관되지만 _FREE_BLOCK으로 표시되고 특별한 바이트 값으로 채워 집니다.

_CRTDBG_CHECK_ALWAYS_DF

Off

모든 할당 및 할당 취소에서 _CrtCheckMemory를 호출하게 합니다. 실행 속도는 지연되지만 오류를 신속하게 찾아 냅니다.

_CRTDBG_CHECK_CRT_DF

Off

_CRT_BLOCK 형식으로 표시된 블록을 누수 탐지와 상태 구별 작업에 포함시킵니다. 비트를 해제하면 위와 같은 작업을 하는 동안 런타임 라이브러리가 내부적으로 사용하는 메모리를 무시합니다.

_CRTDBG_LEAK_CHECK_DF

Off

_CrtDumpMemoryLeaks를 호출하여 프로그램을 종료할 때 누수 검사를 수행합니다. 응용 프로그램이 할당한 모든 메모리를 해제하는 데 실패하면 오류 보고서가 생성됩니다.


여기까지는 준비 과정(?)일 뿐이고 실제로 메모리 릭이 발생했을 때 확인하고자 하는 곳에서 브레이크 포인트를 걸려면 아래와 같이 메모리 할당 번호를 지정하여 확인한다.

int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_crtBreakAlloc(메모리 할당 번호);
...
}

이렇게 하면 원하는 메모리 위치를 확인할 수 있다.
열심히 디버깅 하세~ 예~ 붸뷔~ 요~ 체키라웃~

[참고] MSDN, 네이버님, 여러 블로거님들