Construction Lifetime

생성자와 소멸자는 객체가 진 빚을 시작하고 끝낸다

생성자는 유효한 불변식을 만들고 소멸자는 획득한 자원을 반납한다. 멤버 초기화 순서, 부분 생성 실패, noexcept 소멸 규칙까지 맞아야 RAII가 성립한다.

01

자원을 멤버로 감싼다

파일, 메모리, lock 같은 자원은 unique_ptr, vector, lock_guard 같은 멤버에 맡긴다.

02

생성 실패를 안전하게 둔다

생성자 본문에서 예외가 나도 이미 생성된 멤버와 기반 클래스는 역순으로 정리되어야 한다.

03

소멸자에서 던지지 않는다

정리 실패를 예외로 밖에 내보내면 stack unwinding 중 std::terminate로 이어질 수 있다.

RAII owner
수명 기반 자원 관리 객체 생성과 자원 획득, 소멸과 반납을 하나의 타입에 묶는다.
raw handle만 들고 있으면 누수 신호다.
declaration order
선언 순서 초기화 생성은 선언 순서, 소멸은 역순으로 진행된다.
생성자 리스트 순서가 아니다.
noexcept dtor
unwind 중 안전 소멸자는 예외를 삼키거나 별도 close 함수로 실패를 보고한다.
실패 보고는 명시적 close로 분리한다.
Rule of Zero
직접 관리 제거 표준 타입 멤버가 복사, 이동, 정리를 대신하게 만들어 직접 특수 멤버 함수를 줄인다.
가장 유지보수하기 쉽다.

new/delete · 부분 생성 · 복사 정책 실패 신호

직접 자원 new, delete, fopen, close가 생성자와 소멸자에 흩어져 있지 않은가.
부분 생성 생성자 중간 실패 시 이미 얻은 자원이 멤버 소멸자로 자동 정리되는가.
복사 정책 소멸자를 직접 썼다면 Rule of Five나 복사 금지, 이동 허용을 함께 검토했는가.

멤버에 위임

class Session {
    std::unique_ptr<Connection> connection_;
    std::vector<std::byte> buffer_;
};