2009. 12. 19. 13:19 Programming/Visual Studio
VisualStudio 메모리 누수 체크 사용하기
MFC를 사용하여 프로그램을 개발하고 있다면,
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
위의 코드를 .cpp 화일에 넣어 프로그램이 종료 되었을때 아래와 같이 누수된 메모리를 할당하는 부분의 소스 코드와 라인 수를 출력 해준다.
Detected memory leaks!
Dumping objects ->
d:\sample\sample.cpp(35) : {48} client block at 0x003739D0, subtype 0, 4 bytes long.
Data: <( > 28 00 00 00
d:\sample\sample.cpp(34) : {47} client block at 0x00373990, subtype 0, 4 bytes long.
Data: < > 1E 00 00 00
Object dump complete.
위의 예에서는 두 블록의 메모리 누수가 검출 되었는데 각 라인의 의미는
d:\sample\sample.cp (35) : {48} client block at 0x003739D0, subtype 0, 4 bytes long.
sample.cpp 화일의 35번째 라인에서 할당된 메모리가 누수되었고 그것은 48번째로 할당된 메모리이며 메모리 주소는 0x003739d0, 4Byte가 누수되었다는 의미로 해석할 수 있다.
MFC를 사용하지 않은 프로그램의 경우 위의 DEFINE 문으로는 DEBUG_NEW를 찾을 수 없다는 컴파일 에러를 내뱉는데 그 경우엔 위의 DEFINE 문과 함께 아래와 같은 라인을 헤더에 삽입해서 해결할 수 있다.
#if !defined(_AFXDLL)
#include <windows.h>
#include <crtdbg.h>
#if defined(DEBUG) | defined(_DEBUG)
#if !defined(DEBUG_NEW)
#define DEBUG_NEW new(_CLIENT_BLOCK, __FILE__, __LINE__)
#endif
#endif
#endif
DEBUG_NEW를 새로이 정의함으로써 DEBUG_NEW를 찾을 수 없는 문제를 해결한다.
간혹 malloc 을 이용한 메모리 할당은 위의 내용이 적용이 되질 않는데 이 경우엔 아래의 문장을 소스코드에 삽입한다.
- 헤더 화일에는 아래라인을 추가
#define DEBUG_MALLOC(size) _malloc_dbg(size, _NORMAL_BLOCK, __FILE__ , __LINE__)
- malloc을 재정의 하려는 소스 코드에 아래 라인을 추가.
#define malloc DEBUG_MALLOC
위의 방법들로 memory leak dump 에서 할당된 소스 코드와 라인수를 바로 찾을 수 있다.
'Programming > Visual Studio' 카테고리의 다른 글
error LNK2005: (0) | 2010.01.13 |
---|---|
error LNK2059 (0) | 2010.01.13 |
error LNK1104 (1) | 2010.01.13 |
error LNK2019 fatal, error LNK1120 (0) | 2010.01.13 |
error LNK2005: 에러 (0) | 2009.12.19 |