[C++] Memory Leak Detection 메모리 누수 감지
C, C++ 2026. 4. 16. 19:08 |Visual Studio C++에서 메모리 누수를 감지해 보자.
// 메모리 누수 감지를 위한 헤더 파일과 매크로 정의
#define _CRT_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif
void leak()
{
int* p = new int;
//delete p;
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) - 자동 호출: 프로그램 시작
// 부분에 한 번만 적어두면, 프로그램이 어디서 어떻게 종료되든 간에 종료되는 순간에 알아서
// _CrtDumpMemoryLeaks()를 호출해주어 가장 편리하고 많이 쓰이는 방식.
leak();
int* p = new int;
//delete p;
p = new int;
delete p;
//_CrtDumpMemoryLeaks();
// _CrtDumpMemoryLeaks() - 수동 호출: 원하는 특정 시점의 누수를 바로바로 검사하고 싶을 때 유용.
// 하지만 프로그램이 여러 군데서 return으로 종료되거나 예외로 튕겨 나갈 경우, 일일이 종료
// 직전에 함수를 넣어주기 번거롭다.
return 0;
}
Ctrl+F5(Start Without Debugging)로 실행하면 아무것도 출력되지 않는다. F5(Start Debugging)로 실행해야 한다.
결과는 Output 윈도우에 출력된다.

첫 번째 메모리 누수가 발생하는 지점은 Source.cpp 파일의 27번째 라인이다. {165}의 의미는 프로그램이 시작되고 165번째 메모리 할당이 이루어졌다는 뜻이다. 아래와 같이 _CrtSetBreakAlloc()를 사용하면 165번째 메모리 할당이 되는 시점에 프로그램을 중단하고 디버거를 구동한다.
// 메모리 누수 감지를 위한 헤더 파일과 매크로 정의
#define _CRT_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif
void leak()
{
int* p = new int;
//delete p;
}
int main()
{
_CrtSetBreakAlloc(165);
// 특정 할당 번호에서 중단점 설정: 메모리 누수의 원인을 찾기 위해 특정 할당 번호에서
// 디버거가 중단되도록 설정하는 함수.
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) - 자동 호출: 프로그램 시작
// 부분에 한 번만 적어두면, 프로그램이 어디서 어떻게 종료되든 간에 종료되는 순간에 알아서
// _CrtDumpMemoryLeaks()를 호출해주어 가장 편리하고 많이 쓰이는 방식.
leak();
int* p = new int;
//delete p;
p = new int;
delete p;
//_CrtDumpMemoryLeaks();
// _CrtDumpMemoryLeaks() - 수동 호출: 원하는 특정 시점의 누수를 바로바로 검사하고 싶을 때 유용.
// 하지만 프로그램이 여러 군데서 return으로 종료되거나 예외로 튕겨 나갈 경우, 일일이 종료
// 직전에 함수를 넣어주기 번거롭다.
return 0;
}

_CrtSetBreakAlloc()가 동작하여 디버거가 멈출 때, 내가 작성한 소스 코드가 아닌 new_debug.cpp 같은 알 수 없는 파일에서 멈추는 이유는 new나 malloc을 호출했을 때 실제 메모리를 할당하는 C++ 런타임 라이브러리(CRT)의 최하단 내부 코드에서 브레이크가 걸리기 때문이다.

Call Stack 윈도우에서 현재 위치 아래에 있는 내가 작성한 파일로 판단되는 위치에서 우클릭한다.

Go To Source Code를 클릭한다.

메모리 누수가 발생하는 곳에 커서가 표시된다.
출력을 콘솔로 바꾸고 싶다면 아래와 같이 작성한다.
// 메모리 누수 감지를 위한 헤더 파일과 매크로 정의
#define _CRT_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif
void leak()
{
int* p = new int;
//delete p;
}
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
// _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF) - 자동 호출: 프로그램 시작
// 부분에 한 번만 적어두면, 프로그램이 어디서 어떻게 종료되든 간에 종료되는 순간에 알아서
// _CrtDumpMemoryLeaks()를 호출해주어 가장 편리하고 많이 쓰이는 방식.
// 출력 모드를 콘솔(표준 에러 스트림)로 변경
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR);
leak();
int* p = new int;
//delete p;
p = new int;
delete p;
//_CrtDumpMemoryLeaks();
// _CrtDumpMemoryLeaks() - 수동 호출: 원하는 특정 시점의 누수를 바로바로 검사하고 싶을 때 유용.
// 하지만 프로그램이 여러 군데서 return으로 종료되거나 예외로 튕겨 나갈 경우, 일일이 종료
// 직전에 함수를 넣어주기 번거롭다.
return 0;
}

'C, C++' 카테고리의 다른 글
| [C++] Multi Thread & Mutex 멀티 스레드 & 뮤텍스 (0) | 2026.02.17 |
|---|---|
| Detect Windows Display Scale Factor 윈도우 배율 확인 (0) | 2025.12.22 |
| 명령창(cmd)을 열지 않고 명령 실행하고 결과 받아오기 popen(pipe open), pclose(pipe close) (0) | 2025.04.14 |
| Qt platform plugin error fix (0) | 2021.09.26 |
| Qt6 설치 및 간단한 사용법 (0) | 2021.09.25 |







