[펌] CRT를 이용한 메모리 누수 탐지
1. 모든 소스의 선두에 아래 순서대로 입력한다.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
- 순서가 다르면 안됨
- stdafx.h(미리 컴파일된 해더)에 넣어도 된다.
2. Main()함수 - 맨 처음 시작하는 함수
첫번째 라인에 아래와 같이 적는다.
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
3. VS에서 디버그 모드로 시작(F5)하고, 스스로 종료해야 한다.
(Shift + F5를 하지 말라는 의미임)
4. 기타
- 직접 테스트 해 본 결과로는 Malloc도 가능하다.
(#define new 없으면 new만 된다..-_-a 잘 이해 안됨)
- CRT로는 전체 CallStack을 찍어주지 않고
최종적으로 new를 사용한 곳을 찝어주는 것 같다.
만약 이미 소스에서 new를 다르게 만들어 사용한다면 역시나 찾을 수 없게 될 듯.
[예제]
#include "stdafx.h" //여기엔 이 두가지만 있다.
//#include <iostream>
//#include <tchar.h>
//만약 아래의 내용을 iostream보다 먼저 쓰는 경우 Error가 난다.
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
char* pNew = NULL;
pNew = new char;
char* pMalloc = NULL;
pMalloc = (char*)malloc( sizeof(char) * 10 );
char* pAA = NULL;
pAA = new char[100];
delete [] pAA;
return 0;
}
[잘 된 결과]
- 아래처럼 실제로 사용한 파일명과 할당한 라인 수가 나와야 제대로 된 것
Detected memory leaks!
Dumping objects ->
d:\study myself\디버깅\crtmemoryleak\crtmemoryleak.cpp(30) : {44} normal block at 0x00372D80, 10 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD
d:\study myself\디버깅\crtmemoryleak\crtmemoryleak.cpp(24) : {43} normal block at 0x00372D40, 1 bytes long.
Data: < > CD
Object dump complete.
'[840] CRTMemoryLeak.exe: 네이티브' 프로그램이 0 (0x0) 코드에서 끝났습니다.
[잘못된 결과]
- 순서가 잘못되거나 하면 crtdbg.h파일의 라인수가 나온다.
Detected memory leaks!
Dumping objects ->
c:\program files\microsoft visual studio .net 2003\vc7\include\crtdbg.h(689) : {43} normal block at 0x00372D40, 1 bytes long.
Data: < > CD
Object dump complete.
출처 : 네이버 블로그였는데 까먹음;;;