메모리를 동적으로 할당(new) 한 후 해제(delete) 되지 않았을때 Visual C++ 에서 알아내는 방법에 대하여 알아보자.
참고링크 [Bottom] [Top]
매크로 정의 [Bottom] [Top]
먼저 디버깅 모드에서 동적 메모리를 추적할 수 있도록 아래와 같이 매크로를 정의한다.
1 #ifdef _DEBUG 2 #define new new( _CLIENT_BLOCK, __FILE__, __LINE__ ) 3 #endif
동적 메모리의 추적은 디버그 모드에서만 사용가능하다.
동적 메모리의 추적 방법 설정 [Bottom] [Top]
동적 메모리를 어떻게 추적할지를 제어하기 위하여 설정하는 것으로 메모리를 할당하기 전에 실행해야 한다.
_CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF );
동적 메모리의 추적 방법을 제어하는 비트 필드는 다음과 같다.
비트 필드
기본값
설명
_CRTDBG_ALLOC_MEM_DF
설정
디버그 할당을 사용한다. 이 비트를 해제하면 할당은 함께 연결되어 있지만 블록 형식은 _IGNORE_BLOCK 이다.
_CRTDBG_DELAY_FREE_MEM_DF
해제
부족한 메모리 조건을 시뮬레이션하는 것과 관련해서 메모리가 실제로 해제되는 것을 방지한다. 이 비트를 설정하면, 해제된 블록이 디버그 힙의 연결 리스트에 보관되지만 _FREE_BLOCK으로 표시되고 특별한 바이트 값으로 채워진다.
_CRTDBG_CHECK_ALWAYS_DF
해제
모든 할당 및 할당 취소에서 _CrtCheckMemory를 호출하게 한다. 실행 속도는 지연되지만 오류를 신속하게 찾아낸다.
_CRTDBG_CHECK_CRT_DF
해제
_CRT_BLOCK 형식으로 표시된 블록을 누수 탐지와 상태 구별 작업에 포함시킨다. 비트를 해제하면 위와 같은 작업을 하는 동안 런타임 라이브러리가 내부적으로 사용하는 메모리를 무시한다.
_CRTDBG_LEAK_CHECK_DF
해제
_CrtDumpMemoryLeaks를 호출하여 프로그램을 종료할 때 누수 검사를 수행한다. 응용 프로그램이 할당한 모든 메모리를 해제하는 데 실패하면 오류 보고서가 생성된다.
동적 메모리의 추적 예제 [Bottom] [Top]
1 #include <stdio.h> 2 #include <string.h> 3 #include <crtdbg.h> 4 5 // 매크로 정의 6 #ifdef _DEBUG 7 #define new new( _CLIENT_BLOCK, __FILE__, __LINE__ ) 8 #endif 9 10 int main() 11 { 12 // 동적 메모리의 추적 방법 설정 13 _CrtSetDbgFlag( _CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF ); 14 15 char* s1; 16 char* s2; 17 18 s1 = new char[128]; // 메모리 할당 19 strcpy( s1, "string1" ); 20 21 s2 = new char[256]; // 메모리 할당 22 strcpy( s2, "string2" ); 23 24 delete[] s1; // 메모리 해제 25 26 return 0; 27 }
예제의 결과 [Bottom] [Top]
디버그 모드로 실행후 프로그램이 종료되면 아래의 Visual Studio 의 출력창에 다음과 같은 결과가 출력된다.
---------------------------------------------------------------------------- 'debug.exe': 'C:\temp\debug\Debug\debug.exe' 로드, 기호가 로드되었습니다. 'debug.exe': 'D:\WINXP\system32\ntdll.dll' 로드, 기호가 로드되지 않았습니다. 'debug.exe': 'D:\WINXP\system32\kernel32.dll' 로드, 기호가 로드되지 않았습니다. Detected memory leaks! Dumping objects -> c:\temp\debug\main.cpp(21) : {44} client block at 0x003710B0, subtype 0, 256 bytes long. Data: <string2 > 73 74 72 69 6E 67 32 00 CD CD CD CD CD CD CD CD Object dump complete. '[3340] debug.exe: 기본' 프로그램이 0 (0x0) 코드에서 끝났습니다. ----------------------------------------------------------------------------
여기에서 아래의 메세지는 main.cpp 의 21 번째 줄에서 할당한 256 바이트가 해제 안된 것을 알려준다.
c:\temp\debug\main.cpp(21) : {44} client block at 0x003710B0, subtype 0, 256 bytes long. Data: <string2 > 73 74 72 69 6E 67 32 00 CD CD CD CD CD CD CD CD
