삭제 안전성

기반 포인터로 지울 수 있는 설계인지 확인하기

추상 클래스는 직접 객체를 만들 수 없어도 포인터나 참조로 자주 사용됩니다. 동적 할당 객체를 기반 포인터로 삭제한다면 소멸자 계약까지 인터페이스의 일부로 보아야 합니다.

01

다형적 사용이 있는가

  • 호출 코드가 구체 타입 대신 기반 타입 포인터를 받는가?
  • 컨테이너나 팩토리가 Base* 또는 unique_ptr<Base>를 반환하는가?
02

소유권이 이동하는가

  • 기반 포인터가 객체 수명을 끝낼 책임을 가질 수 있는가?
  • delete, reset, 컨테이너 정리 시점이 기반 타입에서 발생하는가?
03

가상 소멸자가 있는가

  • 기반 클래스에 virtual 소멸자를 선언했는가?
  • 파생 클래스 정리 코드가 먼저 실행되고 기반 소멸자가 이어지는가?

안전한 기본 형태

class Shape {
public:
    virtual double calculateArea() const = 0;
    virtual ~Shape() = default;
};