Rule of 3/5/0

자원 소유 계약

포인터, 파일 핸들, mutex 같은 자원을 클래스가 직접 소유하면 얕은 복사, double delete, 이동 후 상태, noexcept 이동까지 같이 정해야 한다.

01

소유 자원 확인

raw pointer, FILE*, socket fd처럼 소멸 시 해제해야 하는 멤버가 있는지 찾는다.

ownership
02

복사 의미 결정

깊은 복사, 복사 금지, 공유 소유권 중 어떤 의미인지 명시한다.

복사 규칙 계약
03

이동 의미 결정

move 뒤 원본을 안전한 empty 상태로 남기고 새 객체가 자원을 넘겨받는다.

moved-from valid
04

RAII 위임

unique_ptr, vector, string을 쓰면 직접 special member를 작성하지 않으면 Rule of Zero로 간다.

default is best
shallow copy
두 객체가 같은 포인터를 delete 복사 생성자/대입을 직접 정의하거나 복사를 삭제해야 한다.
double free
move noexcept
컨테이너 재배치 최적화 조건 vector는 이동 생성자가 noexcept일 때 복사 대신 이동을 안전하게 선택할 수 있다.
performance
자기 대입
a = a에서 자원 손실 가능 copy-and-swap 또는 자기 대입 가드로 기존 자원 해제 순서를 안전하게 둔다.
operator=
Rule of 0
소유권을 멤버 타입에 맡김 unique_ptr, shared_ptr, vector가 소멸/이동을 처리하면 사용자 정의 함수가 줄어든다.
권장 기본값

리뷰 질문

누가 해제하나 소멸자에서 해제한다면 복사와 이동도 반드시 같은 소유권 의미를 가져야 한다.
복사 가능한가 복사가 의미 없거나 위험하면 =delete로 컴파일 단계에서 막는다.
테스트 복사, 이동, vector push_back, 예외 발생 경로에서 누수와 double free를 확인한다.