C++문법 공부
소멸자의 virtual 선언
막뇌
2023. 6. 30. 12:20
저번 시간에 virtual의 개념에 대해서 학습 했습니다.
이번에는 소멸자(Deconstructor) 를 가상으로 선언하는 이유에 대해 예제를 통해서 알아 보겠습니다.
#include <stdio.h>
class Food
{
public:
Food() { printf("Food 가 생성 되었습니다.\n"); }
~Food() { printf("Food가 소멸되었습니다.\n"); }
};
class Chicken : public Food
{
public:
Chicken() { printf("Chicken이 생성되었습니다.\n"); }
~Chicken() { printf("Chicken이 소멸되었습니다.\n"); }
};
int main()
{
Food* pF;
pF = new Chicken;
delete pF;
}
위 예제는 소멸자를 가상으로 선언하지 않았을 경우 입니다.
Food 클래스를 상속받은 Chicken 클래스가 있죠
main 함수에서 Food클래스를 활용해서 포인터를 만들고 동적할당을 통해 Chicken객체를 할당 받았습니다.
생성할 때는 둘다 생성이 되죠.
하지만 메모리를 해제할 때는 정적으로 해제되기 때문에 최초 생성 할때 당시의 타입을 기억해서 Food의 소멸자만 호출이 됩니다.
#include <stdio.h>
class Food
{
public:
Food() { printf("Food 가 생성 되었습니다.\n"); }
virtual ~Food() { printf("Food가 소멸되었습니다.\n"); }
};
class Chicken : public Food
{
public:
Chicken() { printf("Chicken이 생성되었습니다.\n"); }
virtual ~Chicken() { printf("Chicken이 소멸되었습니다.\n"); }
};
int main()
{
Food* pF;
pF = new Chicken;
delete pF;
}
virtual 을 통해서 동적 바인딩이 실행 되면서 Chicken 의 소멸자가 먼저 호출 되도록 합니다.
상속으로 연결된 객체들이 메모리 누수가 발생하지 않고 안전하게 소멸된 것을 확인할 수 있습니다.
위와 같은 이유로 인해 클래스를 구성할 때 상속개념을 아예 사용하지 않을 계획이 아니라면
소멸자는 항상 가상으로 선언해주는것이 좋습니다. 나중에 계획이 바뀔 지도 모르니까 왠만하면요.