Nagie's DevStory

[CPP] 32. 순수 가상 소멸자 (Pure Virtual Destructor) 본문

Programming/C++

[CPP] 32. 순수 가상 소멸자 (Pure Virtual Destructor)

Nagie 2023. 10. 22. 17:47
728x90

간혹 클래스를 설계하다 보면 추상 클래스로 만들고 싶어도

멤버 함수에 순수 가상함수를 쥐어줄 수 없는 경우가 존재하기도 한다.

그때 사용하는 것이 순수 가상 소멸자인데

소멸자를 순수 가상함수로 만드는 것으로 멤버 함수 중 순수 가상함수가 없어도

해당 클래스가 인스턴스를 생성할 수 없는 추상 클래스로 변한다.

다만 순수 가상 소멸자를 선언했다면 클래스 내부에서 가상 소멸자를 또 선언할 수 없기에

클래스 밖에서 정의를 해줘야 한다.

 

class AbstractBase {
public:

    virtual ~AbstractBase() = 0; // 순수 가상 소멸자
};

AbstractBase::~AbstractBase() {

    // 순수 가상 소멸자의 기본 구현
}

class Derived : public AbstractBase {
public:

    ~Derived() override {
    
        // 파생 클래스의 소멸자 구현
    }
};

int main() {

    AbstractBase* ptr = new Derived;
    delete ptr; // 파생 클래스의 소멸자가 호출됨
}

 

또한 가상 소멸자를 사용하는 이유가 하나 더 있는데 바로 메모리 누수 방지를 위해 사용된다.

기본 클래스 포인터를 사용하여 파생 클래스 객체를 가리킬 때, 파생 클래스 객체를 제대로 소멸시키려면

가상 소멸자를 가져야 하고 순수 가상 소멸자를 통해 파생 클래스의 소멸자가 호출되어 메모리 누수를 방지할 수 있다.

728x90
Comments