C++ 생성과 파괴

생성자·소멸자를 자원 소유권의 시작과 끝으로 설계하기

생성자는 객체를 사용 가능한 상태로 만들고 소멸자는 소유한 자원을 확실히 반납한다. new/delete 짝맞춤보다 멤버 객체가 스스로 정리되는 RAII 구조인지가 더 중요하다.

01

획득

파일, 메모리, 락, 핸들을 생성자나 팩토리에서 소유 객체로 감싼다.

raw handle 숨김
02

자원 사용 구간

public 함수는 객체가 이미 유효한 상태라는 전제에서 동작한다.

half-initialized 금지
03

해제

스코프가 끝나면 멤버 소멸자가 역순으로 실행되어 자원을 반환한다.

자동 정리
04

상속 삭제

base 포인터로 delete할 수 있으면 base destructor는 virtual이어야 한다.

부분 소멸 방지
소멸자 예외
던지지 않는 것이 원칙 stack unwinding 중 소멸자 예외가 나오면 terminate로 이어질 수 있다.
noexcept 유지
멤버 순서
생성은 선언 순서, 소멸은 역순 의존 멤버는 의존 대상보다 뒤에 선언하면 파괴 순서가 안전하다.
순서 설계
복사 금지
소유 자원은 기본 복사 위험 unique 소유권은 복사를 삭제하고 이동을 제공하는 편이 안전하다.
double free 방지
팩토리
실패 가능한 생성 분리 생성자에서 복잡한 실패 처리가 부담되면 factory가 Result-like 반환을 맡는다.
불변식 보존

virtual dtor · raw 자원 · 부분 생성 점검

virtual dtor base class에 virtual 함수가 있고 다형 삭제 가능성이 있으면 소멸자도 virtual인지 본다.
raw 자원 직접 new/delete, fopen/fclose, lock/unlock 짝이 남아 있는지 찾는다.
부분 생성 생성자 중간 실패 시 이미 획득한 자원이 멤버 소멸자로 정리되는지 확인한다.