디모그 모드에서 프로그램을 종료하면 메모리 릭이 발생하는 경우가 있다.
그때 vs의 output 창에 아래와 같은 메시지가 나온다.


Detected memory leaks!
Dumping objects ->
{130} normal block at 0x004866F0, 712 bytes long.
 Data: <xA  8bH       ' > 78 41 03 10 38 62 48 00 01 CD CD CD 02 00 27 11 


이 메모리 릭을 어떻게 찾아야 하나 막막했다.
그런데 CRT에는 릭을 감지하는 debug function들이 있다. 이 함수들을 사용하면 메모리 릭이 있는 위치를 찾을 수 있다.

한가지 덧 붙이자면 릭 메시지 안의 {130} 의 의미는 프로그램에서 몇번째로 할당 받은 영역이라는 것이다. 위 메시지는 130번째로 할당받았다는 의미다.

메모리 릭을 추적하기 위해 Crt 함수를 사용하면 된다. Crt 함수를 사용하기 위해서는 다음 순서를 반드시 따라야 한다.

#include <stdlib.h>
#include <crtdbg.h>

_CrtDumpMemoryLeaks(); // 이 함수는 output 창에 메모리 릭 정보를 출력시킨다.
_CrtSetBreakAlloc( 130 ); // 이 함수는 130번째 메모리를 할당하려고 할 때 프로그램을 break 시켜준다.
_crtBreakAlloc = 130; // 이렇게 사용할 수 도 있다.

_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
이 문은 프로그램이 종료될 때 자동으로 _CrtDumpMemoryLeaks를 호출한다.


_CrtSetDbgFlag 함수는 다섯개의 Flag 가 있다.
_CRTDBG_ALLOC_MEM_DF : 디폴트로 켜져 있으며, 디버그 버전에서 모든 메모리 할당이 일어날 때마다 추적 가능하도록 특별한 기능을 추가해 준다. 이 플래그가 켜져 있어야 메모리 누수를 안전하게 검사할 수 있다.

_CRTDBG_DELAY_FREE_MEM_DF : delete, free 등으로 삭제되어도 바로 삭제되지 않고, CRT의 메모리 관리소에 남아 있다가 프로그램 종료시에 완전히 삭제된다.

_CRTDBG_CHECK_ALWAYS_DF : 모든 메모리관련 연산에서 _CrtCheckMemory를 호출한다.

_CRTDBG_CHECK_CRT_DF : CRT가 내부적으로 할당한 블록도 메모리를 체크할 때 포함한다. 일반적으로는 CRT가 할당한 블록은 메모리 체크에서 제외된다. 일반적으로 사용하지 않는다.

_CRTDBG_LEAK_CHECK_DF : 프로그램이 완전히 종료되기 직전에 아직 해체되지 않는 메모리가 있는지 검사한다. 프로그램의 종료 포인트가 여러운데 있는 경우에 사용하면 일일이 _CrtDumpMemoryLeaks 메소드를 호출하지 않아도 자동적으로 메모리 누수를 검사할 수 있게 된다.

이중 _CRTDBG_ALLOC_MEM_DF를 제외하고는 모두 디폴트로 꺼져 있다. 그러므로 다음과 같이 메모리 검사 기능을 켜도록 해야한다. 
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
// MFC의 경우는 위의 옵션이 활성화 되어 있다.


Bloger : moltak.net

'Programming > 이것저것' 카테고리의 다른 글

[펌] valgrind 를 이용한 메모리 관리  (0) 2011.03.15
Doxygen - 작성중  (0) 2011.03.08
typeid 2  (1) 2010.05.25
세그먼트 레지스터  (0) 2010.05.01
x86 Register  (0) 2010.04.30

+ Recent posts