본문 바로가기
스터디/C++

[ C++ ] 가상 소멸자( Virtual Destructor )

by 알 수 없는 사용자 2019. 10. 10.

말 그대로 virtual로 선언된 소멸자를 가상 소멸자( Virtual Destructor )라고 한다.

근데 왜 소멸자에 virtual 선언이 필요할까?

 

먼저 예제를 보자.

 

 

( * 혹시 VS에서 위 코드를 작성하다가 다음과 같은 에러가 발생한 경우,

"const char * 형식의 인수가 char * 형식의 매개 변수와 호환되지 않습니다"

프로젝트( 오른쪽 클릭 ) > 속성 > C/C++ > 언어 > 준수 모드 > 아니오로 바꿔주면 해결된다.

VS 2015에는 가능한데 VS 2017부터 준수 모드가 생겨서 생긴 문제이다. )

 

결과에서 보이듯이 객체의 소멸을 A형 포인터로 명령하니, A 클래스의 소멸자만 호출되었다.

따라서 strB가 남아있어, 메모리 누수가 발생하게 된다. 

 

즉, 객체의 소멸과정에서는 포인터 변수의 자료형에 상관없이 모든 소멸자가 호출되어야 하는데

그 해결 방법이 가상 소멸자이다.

 

 

가상 함수와 동일하게 상속 구조의 맨 위에 있는 기초 클래스의 소멸자만 virtual 선언하면, 이를 상속하는 유도 클래스의 소멸자들도 모두 가상 소멸자로 선언이 된다. 그리고

 

가상 소멸자가 호출되면, 상속 구조의 맨 아래에 있는 유도 클래스의 소멸자가 대신 호출되면서, 기초 클래스의 소멸자가 순서대로 호출된다.

 

 

그리하여 메모리 누수 문제를 해결하게 된다.