resource ownership
리소스를 직접 소유하면 복사, 이동, 소멸 정책을 함께 정해야 한다
Rule of Three/Five/Zero는 특수 멤버 함수를 외우는 규칙이 아니라 소유권을 어디에 둘지 결정하는 수명 주기 설계 기준이다.
| 상황 | 필요한 정책 | 놓치면 생기는 문제 | 권장 방향 |
|---|---|---|---|
| 직접 소유 없음 | 컴파일러 기본 특수 멤버를 사용한다. | 불필요한 직접 정의가 이동 최적화를 막을 수 있다. | Rule of Zero를 우선 선택한다. |
| 소멸자 직접 정의 | 복사 생성자와 복사 대입도 함께 검토한다. | 포인터 값만 복사되어 이중 해제나 누수가 생긴다. | Rule of Three 기준으로 한 묶음으로 본다. |
| 이동 가능한 소유권 | 이동 생성자와 이동 대입까지 정의한다. | 임시 객체 복사 비용이 커지고 원본 상태가 불명확해진다. | Rule of Five로 이전 후 원본을 안전한 상태로 둔다. |
| 스마트 포인터 사용 |
std::unique_ptr, 컨테이너에 소유권을 맡긴다.
|
수동 new/delete가 클래스 전체 책임으로 번진다. | 직접 소멸자를 없애 Rule of Zero로 되돌린다. |
소유한 자원이 있는지 먼저 보고, 직접 소유한다면 복사와 이동까지 함께 닫는다. 가능하면 소유권 타입에 위임해서 특수 멤버 함수를 직접 쓰지 않는다.