Coding Memo

[C++] 가상 소멸자 본문

Language/C++

[C++] 가상 소멸자

minttea25 2024. 3. 6. 14:49

가상 소멸자 (virtual destructor)은 C++의 다형성과 관련된 기능 중 하나이다. 

다음 코드에서와 같이 기본 클래스 (base class, parent class)에서 파생 클래스 (derived class, child class)의 포인터를 사용할 때, 파생 클래스의 소멸자를 호출하기 위해 가상 소멸자를 사용한다.

class Base { };

class Derived : public Base { };

int main() {
    Base* ptr = new Derived(); // 파생 클래스의 포인터를 기본 클래스 포인터로 저장
    
    /// ...
    
    return 0;
}

 

 

위 코드에서 만약 delete ptr를 한다면 Base의 소멸자만 호출이 된다.

즉, Base에 대한 데이터는 delete 되지만, Derived 클래스에 대한 데이터는 정리되지 않기 때문에 메모리 누수가 발생한다.

따라서 가상 소멸자를 사용하여 파생 클래스의 소멸자를 호출하도록 한다.

class Base {
public:
    virtual ~Base()
    {
        cout << "Base destructor" << endl;
    }
};

class Derived : public Base {
public:
    ~Derived() override
    {
        cout << "Derived destructor" << endl;
    }
};

int main() {
    Base* ptr = new Derived();
    delete ptr;
    return 0;
}

// result
// Derived destructor
// Base destructor

 

=> Base* 타입 delete 시, 할당되어 있던 파생 클래스(Derived)의 소멸자가 먼저 호출 되고, 이후에 기본 클래스 (Base)의 소멸자도 호출 된다. 메모리 누수를 방지할 수 있다.