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.


출처 : 네이버 블로그였는데 까먹음;;;

Posted by Gungume
,