Ctor Dtor

생성자는 조건을 세우고 소멸자는 빚을 남기지 않는다

생성자와 소멸자는 객체 수명의 문이다. 이 구간이 안전해야 예외가 나도 리소스가 새지 않고, 함수 본문은 이미 유효한 객체만 다루게 된다.

01

멤버 우선 생성

베이스 클래스, 멤버, 생성자 본문 순서로 진행되므로 검증할 위치를 나눠야 한다.

02

실패를 허용한다

생성자가 예외를 던지면 생성 완료 전 멤버만 정리된다. raw handle은 멤버 타입으로 감싸 둔다.

03

소멸에서 조용히 닫는다

소멸자는 예외를 밖으로 내보내지 않고 자원 반환을 완료해야 안전하다.

로그 실패와 close 실패 정책은 별도 함수로 분리한다.
초기화
선언 순서 멤버 초기화 순서가 어긋나면 아직 만들어지지 않은 값을 참조할 수 있다.
-Wreorder 경고를 켠다.
RAII
자원은 객체로 파일, mutex, 메모리, 소켓을 소멸 가능한 타입에 넣는다.
delete와 close가 본문에 흩어지면 위험하다.
소멸자
noexcept 기대 stack unwinding 중 예외가 다시 나오면 terminate로 이어질 수 있다.
실패 보고는 명시 close 함수가 맡는다.
복사 제어
소유권과 연결 소멸자를 직접 쓰면 복사와 이동 정책도 함께 점검한다.
Rule of Zero를 먼저 노린다.

부분 생성 · 소멸 실패 · 직접 delete 점검

부분 생성 생성자 중간 실패 시 이미 얻은 리소스가 자동으로 회수되는가.
소멸 실패 소멸자 안에서 예외가 발생할 가능성을 삼키거나 다른 경로로 처리하는가.
직접 delete 소멸자에 delete가 있다면 unique_ptr이나 vector로 바꿀 수 있는지 먼저 본다.

RAII 멤버

class LogFile {
public:
    explicit LogFile(std::filesystem::path path) : out_(path) {
        if (!out_) throw std::runtime_error("open failed");
    }
private:
    std::ofstream out_;
};