반응형
C++ 컴파일러는 포인터의 자료형을 기준으로 판단하기 때문에, 소멸자 호출 시 해당 자료형 클래스의 소멸자만 호출된다.
예를 들어, Parent* parent = new Child(); 로 선언한 객체를 소멸하면 Parent의 소멸자만 호출되고, Child의 나머지 부분은 메모리에 계속 남게 된다.
상속 관계를 갖는 객체 소멸 과정에서는 자료형에 상관없이 모든 소멸자가 호출되어야 한다.
가상 소멸자
상속 계층의 맨 위에 존재하는 부모 클래스의 소멸자를 virtual로 정의하면 이를 상속하는 자식 클래스의 소멸자들도 모두 '가상 소멸자'로 선언된다.
가상 소멸자가 호출되면, 상속의 계층 구조상 맨 아래에 존재하는 자식 클래스의 소멸자가 대신 호출되면서 부모 클래스의 소멸자까지 순차적으로 호출된다.
virtual ~Parent() {
delete []var;
}
밑의 예시에선 가상 소멸자를 어떻게 사용하는지를 보여준다.
가상 소멸자를 선언하지 않았다면 자료형 Life에 따라서 ~Life()만 출력 되었을테지만, 부모 클래스인 Life에 가상 소멸자를 선언했기 때문에 ~Animal()과 ~Life()가 둘 다 출력된다.
#include <iostream>
using namespace std;
class Life {
private:
char* strOne;
public:
Life(char * str) {
strOne = new char[strlen(str)+1];
}
virtual ~Life() {
cout << "~Life()" << endl;
delete []strOne;
}
};
class Animal : public Life {
private:
char* strTwo;
public:
Animal(char* str1, char* str2) : Life(str1) {
strTwo = new char[strlen(str2)+1];
}
~Animal() {
cout << "~Animal()" << endl;
delete []strTwo;
}
};
void main() {
Life* life = new Animal("생물","동물");
delete life;
}
반응형