special member functions

Rule of Zero/Three/Five 적용 조건

클래스가 raw resource를 직접 소유하는지부터 보면 소멸자, 복사 생성자, 복사 대입, 이동 생성자, 이동 대입을 직접 선언할지 결정할 수 있습니다.

RAII 멤버std::string, vector
Rule of Zero특수 멤버 미선언
raw handlenew, FILE*, fd
copy/move 정책=delete 또는 noexcept move
01

raw resource 확인

new/delete, malloc/free, FILE*, socket fd처럼 수명 종료 함수가 따로 있는 멤버가 있는지 찾습니다.

02

Rule of Zero 유지

std::string, std::vector, std::unique_ptr가 소유권을 감싸면 소멸자와 대입 연산자를 직접 만들지 않습니다.

03

Three/Five 세트

소멸자를 직접 썼다면 복사 생성자와 복사 대입을 검토하고, 이동을 허용하면 이동 생성자와 이동 대입까지 맞춥니다.

04

=delete와 noexcept

unique owner는 copy를 =delete로 막고, 컨테이너 이동 최적화를 원하면 move 생성자에 noexcept를 검토합니다.

자원 소유권 테스트

  • 얕은 복사 뒤 두 객체가 같은 포인터를 delete하면 double free 위험입니다.
  • 복사 대입은 자기 대입과 예외 중간 실패에도 기존 객체가 깨지지 않아야 합니다.
  • 소유권 이전이 필요하면 moved-from 객체가 소멸 가능한 상태로 남아야 합니다.

규칙 매칭

Zerocustom destructor 없음
Threedestructor + copy ctor + copy assign
Fivemove ctor + move assign까지 명시
Delete복사 불가 소유권을 컴파일러가 차단