본문 바로가기
Development/C++

가상 소멸자의 사용 이유

by KingCat 2014. 9. 22.

- 클래스 내부에서 메모리를 동적할당하는 경우 소멸자에서 메모리 해제를 해주는데, 상속받은 부모의 소멸자가 가상 소멸자가 아닌 경우 객체 생성시 실제 객체의 클래스가 아닌, 생성된 포인터 자료형에 따라 소멸자가 호출된다. 결국 부모 클래스의 소멸자만 호출되고 메모리 누수가 발생한다. 하여 다형성을 지원할 수 있는 기본 클래스의 경우 소멸자를 가상함수로 지정해 놓아야한다.


예를 들면


Class A

{

A();

~A();

}


Class B : public A

{

B();

~B();

}


이렇게 있을 경우


효율적인 객체 관리 (다형성) 를 위해


A* a = new B();


이런식으로 B 객체를 A 클래스 포인터 자료형으로 만들어서 A* 객체들을 관리할 수 있다.

하지만 이때 객체 a의 실제 객체는 B 클래스다.

여기서 a가 파괴되어 소멸자가 호출되어야 할때, 자료형이 A*이므로 ~A();가 호출된다.

즉, new B();를 통해 생성할때 B 클래스에서 동적할당을 사용했다던가 해서 ~B()에 메모리 해제를 넣어놨더라도

실제 호출이 안된다는 뜻이다. 정상적으로 ~B()를 호출하기 위해서는 ~A()가 호출될때 실제 객체의 소멸자를 호출하도록 해야한다. 이를 위한 키워드가 virtual 이고, A의 소멸자에 virtual을 붙이므로써 객체 소멸시 실제 객체를 참조해서 소멸자를 호출하게 한다.


class A

{

A();

virtual ~A();

}


이렇게 해놓아야 A*가 소멸될때 그 객체가 A를 상속받은 자식 클래스라면 자식 본인의 소멸자를 호출 후 A의 소멸자가 호출된다.