C++ 스마트 포인터

스마트 포인터 소유권 타입 표현

스마트 포인터는 delete를 자동화하는 도구가 아니라 누가 소유하고 언제 해제되는지를 타입으로 표현한다. unique_ptr, shared_ptr, weak_ptr의 비용과 순환 참조 위험을 구분한다.

01

소유자 판정

객체를 반드시 하나의 주체가 관리하면 unique_ptr부터 고려한다.

기본 선택
02

공유 기준

여러 주체가 수명을 연장해야 할 때만 shared_ptr을 쓴다.

참조 카운트 비용
03

순환 차단

부모-자식, 그래프 관계에서 한쪽은 weak_ptr로 관찰만 하게 만든다.

cycle leak 방지
04

전달 정책

소유권 이동은 unique_ptr 값으로, 관찰은 raw pointer/reference로 구분한다.

API 의도
make_unique
단일 객체 안전 생성 new를 직접 노출하지 않고 예외 안전하게 소유권을 만든다.
C++14
make_shared
제어 블록과 객체 통합 할당 수를 줄일 수 있지만 weak_ptr이 남으면 메모리 회수 시점이 늦을 수 있다.
수명 미묘
shared_from_this
자기 자신 공유 enable_shared_from_this 없이 this로 shared_ptr을 만들면 이중 제어 블록이 생긴다.
double delete 위험
custom deleter
특수 자원 해제 FILE*, 핸들처럼 delete가 아닌 해제 함수가 필요한 자원을 감싼다.
RAII 확장

shared 남용 · 순환 · 관찰자 점검

shared 남용 수명 소유가 불명확해서 shared_ptr을 쓴 것은 아닌지 확인한다.
순환 서로 shared_ptr을 들고 있는 구조가 있는지 그래프를 그린다.
관찰자 소유하지 않는 함수 인자는 shared_ptr보다 T& 또는 T*가 더 적합한지 본다.