게임 기획 제련소
article thumbnail
Published 2023. 5. 10. 14:55
Virtual 소멸자 🧠프로그래밍/C++

소멸자의 특수성에 대해서 알아보자

소멸자(destructor)는 객체가 소멸될 때 호출되는 함수이다. 객체가 생성될 때는 생성자가 호출되고, 객체가 소멸될 때는 소멸자가 호출된다.

#include <iostream>

class A
{
public:
    A()
    {
    }

    ~A()
    {
    }

};

class B : public A
{
public:
    B()
    {
    }

    ~B()
    {
    }
};

int main()
{
    A* NewA = new B(); // 업캐스팅 때문에 가능
    delete NewA;
}

위 코드의 생성자 소멸자의 호출순서는 다음과 같다.

 

생성자 : A의 생성자 호출 -> B의 생성자 호출 

소멸자 : A의 소멸자만 호출

 

delete NewA를 해보면 원래 역순으로 B의 소멸자가 먼저 호출이 되어야 하는것이 아닌가??? 했지만

B의 소멸자가 호출되지 않은 이유는 A클래스의 소멸자가 virtual로 선언되지 않았기 때문이다.

 

그럼 virtual이랑 무슨 상관인데?? 라는 생각이 들었다.

 

컴파일러는 소멸자의 이름을 ~ 로 생각하고, virtual을 붙이지 않았을 때는 일반적인 함수와 동일하게 판단한다.

 

이는 객체의 실제 타입이 B 이지만, A 포인터로 가리켜서 B 클래스의 소멸자가 호출되지 않기 때문이다.

 

가상 소멸자는 상속 관계의 파생 클래스에서 기본 클래스 소멸자를 오버라이딩할 수 있도록 한다. 가상 소멸자를 사용하면, 파생 클래스에서 delete를 호출할 때 기본 클래스와 파생 클래스의 소멸자가 모두 호출되어 메모리 누수를 방지할 수 있다.

 

그래서 A의 소멸자의 virtual을 붙여주게 되면,

 

B클래스 또한 올바르게 소멸자를 호출할 수 있다.

'🧠프로그래밍 > C++' 카테고리의 다른 글

BitOperator  (0) 2023.03.02
C++의 Bit  (0) 2023.03.01
개체? 객체?  (0) 2023.03.01
레퍼런스  (0) 2022.10.28
포인터 이해하기  (0) 2022.10.27
profile

게임 기획 제련소

@악마반장

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!