C++ 메모리 누수
1. 개요
1.1 문서 개요
이 문서는 C++에서 발생할 수 있는 메모리 누수(Memory Leak)의 원인, 증상, 그리고 방지 방법에 대해 설명합니다. 메모리 누수는 동적으로 할당된 메모리를 적절히 해제하지 못했을 때 발생하며, 장기적으로 프로그램 성능 저하 및 시스템 자원 고갈을 유발할 수 있습니다.
2. 내용
2.1 메모리 누수의 정의 및 원인
메모리 누수는 동적으로 할당된 메모리가 더 이상 참조되지 않지만 해제되지 않은 상태로 남아있는 경우를 말합니다.
2.1.1 주요 원인
new
로 할당한 객체를delete
로 해제하지 않음- 포인터를 덮어쓰기하여 기존 할당 영역을 참조 불가 상태로 만듦
- 예외 처리 미비로 인해 해제 코드 도달 실패
2.1.2 예시
int* ptr = new int[10];
ptr = nullptr; // 메모리 누수 발생 (원래의 메모리 해제 안됨)
2.2 메모리 누수 진단 도구
2.2.1 Valgrind (Linux)
valgrind --leak-check=full ./your_program
2.2.2 Visual Studio CRT Debug (Windows)
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
_CrtDumpMemoryLeaks();
2.3 메모리 누수 방지 기법
2.3.1 delete 사용
int* ptr = new int;
delete ptr; // 적절한 해제
2.3.2 스마트 포인터 사용 (unique_ptr
, shared_ptr
)
#include <memory>
std::unique_ptr<int> uptr(new int(10)); // 자동 소멸
2.3.3 예외 안전한 코드 작성
try {
int* ptr = new int[100];
// 작업 수행
delete[] ptr;
} catch (...) {
// 예외 처리
}
2.4 메모리 누수와 리소스 관리 정책
- RAII(Resource Acquisition Is Initialization)를 통한 자원 생명주기 자동 관리
- 객체 생성 시 자원 획득, 소멸 시 자동 반환
- 스마트 포인터 및 컨테이너 사용으로 수동 해제 최소화
3. 마무리
메모리 누수는 장기적인 프로그램 안정성과 성능 유지에 직접적인 영향을 미치는 문제로, 프로그래밍 과정에서 철저한 관리가 필요합니다. 스마트 포인터, 자동 자원 관리 기법(RAII), 예외 안전한 코드 작성 등을 통해 메모리 누수를 방지할 수 있으며, 도구를 활용한 정적·동적 분석도 유효한 진단 방법입니다.