#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내에서 초기화시 위와 같은 체크준비를 똑같이 해야 함)
'library > CRT' 카테고리의 다른 글
CRT(C Runtime) Debugger사용방법 (0) | 2014.05.14 |
---|---|
컴파일 옵션 (0) | 2013.02.22 |
errno (0) | 2011.01.08 |
유니코드를 위한 함수 (0) | 2011.01.08 |
시간과 날짜와 관련된 라이브러리 함수들 (0) | 2010.12.15 |