티스토리 뷰

http://msdn.microsoft.com/ko-kr/library/e5ewb1h3

이 항목은 다음 언어에 적용됩니다.

Edition

Visual Basic

C#

C++

Web Developer

Express

항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

Standard

항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

Pro 및 Team

항목이 적용되지 않음 항목이 적용되지 않음

네이티브 전용

항목이 적용되지 않음

표의 범례:

항목이 적용됨

해당

항목이 적용되지 않음

해당 없음

항목이 적용되지만 명령은 기본적으로 숨겨짐

명령은 기본적으로 숨겨져 있습니다.

메모리 누수를 탐지하는 데 사용하는 기본 도구는 디버거와 CRT(C 런타임 라이브러리) 디버그 힙 함수입니다. 디버그 힙 함수를 사용하려면 다음 문이 프로그램에 포함되어 있어야 합니다.

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
참고:

#include 문은 위의 순서를 따라야 합니다. 순서를 변경하면 함수를 사용해도 제대로 작동하지 않습니다.

crtdbg.h를 포함하여, 메모리 할당과 할당 취소를 추적하는 해당 디버그 버전, _malloc_dbg_free_dbgmallocfree 함수를 매핑합니다. 이 매핑은 _DEBUG가 정의된 디버그 빌드에서만 발생합니다. 릴리스 빌드에서는 일반적인 malloc 함수와 free 함수가 사용됩니다.

#define 문은 CRT 힙 함수의 기본 버전을 해당 디버그 버전에 매핑합니다. 이 문을 반드시 사용할 필요는 없지만 사용하지 않으면 메모리 누수 덤프에 별로 유용하지 않은 정보가 포함될 수 있습니다.

위에서 설명한 문을 추가한 후 프로그램에 다음 문을 포함하여 메모리 누수 정보를 덤프할 수 있습니다.

_CrtDumpMemoryLeaks();

디버거에서 프로그램을 실행하면 _CrtDumpMemoryLeaks출력 창에 메모리 누수 정보를 표시합니다. 메모리 누수 정보가 다음과 같이 표시됩니다.

Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18} 
normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

#define _CRTDBG_MAPALLOC 문을 사용하지 않으면 메모리 누수 덤프가 다음과 같이 표시됩니다.

Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.

_CRTDBG_MAP_ALLOC가 정의되지 않으면 다음 사항이 표시됩니다.

  • 메모리 할당 번호(중괄호 안에 표시)

  • 블록 형식(표준, 클라이언트 또는 CRT)

  • 16진수로 표기한 메모리 위치

  • 바이트로 표기한 블록 크기

  • 16진수로 표기한 처음 16바이트의 내용

_CRTDBG_MAP_ALLOC가 정의되면 누수된 메모리가 할당된 파일을 찾을 수 있습니다. 파일 이름 뒤에 오는 괄호 안의 숫자(예: 20)는 파일에서의 줄 번호입니다.

메모리가 할당된 소스 파일의 줄로 이동하려면

  • 출력 창에서 파일 이름과 줄 번호가 있는 줄을 두 번 클릭합니다.

    - 또는 -

    출력 창에서 파일 이름과 줄 번호가 있는 줄을 선택하고 F4 키를 누릅니다.

_CrtSetDbgFlag

프로그램이 항상 동일한 위치에서 종료되는 경우에는 _CrtDumpMemoryLeaks를 쉽게 호출할 수 있습니다. 프로그램이 여러 위치에서 종료될 수 있는 경우에는 종료할 수 있는 모든 위치에서 _CrtDumpMemoryLeaks를 호출하는 대신 프로그램 시작 부분에 다음 호출을 포함할 수 있습니다.

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

이 문은 프로그램이 종료될 때 자동으로 _CrtDumpMemoryLeaks를 호출합니다. 위의 예제와 같이 비트 필드 _CRTDBG_ALLOC_MEM_DF_CRTDBG_LEAK_CHECK_DF를 모두 설정해야 합니다.

CRT 보고서 모드 설정

기본적으로 _CrtDumpMemoryLeaks는 위에서 설명한 대로 출력 창의 디버그 창으로 메모리 누수 정보를 덤프합니다. _CrtSetReportMode를 사용해 다른 위치로 덤프하도록 다시 설정할 수 있습니다. 라이브러리를 사용할 경우 출력을 다른 위치로 다시 설정할 수 있습니다. 이 경우 다음 문을 사용하여 출력 위치를 출력 창으로 다시 설정할 수 있습니다.

_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );

자세한 내용은 _CrtSetReportMode를 참조하십시오.