library/CRT

메모리 누수 체크

란마12 2011. 10. 27. 19:49

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

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

void ExitHandler(){
  _CrtDumpMemoryLeaks();
}

void main(){
#ifdef _DEBUG
  _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
 //_crtBreakAlloc = 129;
 //_CrtSetBreakAlloc(132);
 atexit(&ExitHandler);
#endif
}

다음과 같이 누수가 보고됐다면

Detected memory leaks!
Dumping objects ->
{994} normal block at 0x00DA55A0, 8 bytes long.
 
Data: <        > CD CD CD CD CD CD CD CD
{993} normal block at 0x00DA5558, 8 bytes long.
 
Data: <        > CD CD CD CD CD CD CD CD
{992} normal block at 0x00DA54C8, 8 bytes long.
 
Data: <        > CD CD CD CD CD CD CD CD


중괄호 안의 숫자, 예를 들어 {994} 지점에서 중단점을 설정

_crtBreakAlloc = 994; 또는 _CrtSetBreakAlloc(994);


- stl변수가 전역으로 초기화 되면 릭이 발생된 것으로 표시됨.
  가능하면 전역으로 쓰지말고 함수의 정적변수로 사용.

- vld쓰다가 최신 버전으로 교체했는데 멀티스레드에서 com사용할 때 문제가 있는 듯.

- 메인 프로세스에서 참조하고 있는 dll library내의 누수는 잡지 못함.(dll내에서 초기화시 위와 같은 체크준비를 똑같이 해야 함)