C++ 메모리 누수 탐지

누수 추적 기준

메모리 누수는 단순히 delete가 빠진 문제가 아니라 객체를 누가 소유하는지 불명확하다는 신호다. sanitizer, Valgrind, heap snapshot으로 누수 지점을 찾고 RAII 타입으로 구조를 바꾼다.

01

재현

누수가 늘어나는 입력과 반복 횟수를 고정해 도구가 같은 결과를 내게 한다.

시나리오 확보
02

탐지

LeakSanitizer, AddressSanitizer, Valgrind로 할당 스택과 잔존 객체를 확인한다.

도구 교차 확인
03

소유권 분석

할당한 객체가 어느 owner에게 넘어가고 어디서 해제되어야 하는지 그래프로 그린다.

책임 찾기
04

구조 수정

raw owning pointer를 unique_ptr/shared_ptr 또는 컨테이너로 바꿔 해제를 수명에 묶는다.

RAII
definitely lost
포인터를 잃은 누수 더 이상 해제할 방법이 없는 메모리라 즉시 수정 대상이다.
Valgrind 용어
indirect
누수 객체가 소유한 하위 객체 루트 누수를 고치면 함께 사라질 수 있다.
원인부터
still reachable
종료 시 남아 있는 전역/캐시 의도된 캐시인지 종료 정리가 필요한지 정책으로 판단한다.
항상 버그는 아님
cycle
shared_ptr 순환 서로 참조 카운트를 붙잡는 구조는 weak_ptr로 끊는다.
소유 그래프

소유 타입 · 예외 경로 · 반복 테스트 점검

소유 타입 소유 포인터는 unique_ptr로, 비소유 관찰은 raw pointer/reference로 구분한다.
예외 경로 중간 예외가 나도 이미 할당한 메모리가 RAII로 정리되는지 본다.
반복 테스트 긴 실행이나 반복 로드/언로드에서 heap 사용량이 계속 증가하지 않는지 확인한다.