말 그대로 virtual로 선언된 소멸자를 가상 소멸자( Virtual Destructor )라고 한다.
근데 왜 소멸자에 virtual 선언이 필요할까?
먼저 예제를 보자.
( * 혹시 VS에서 위 코드를 작성하다가 다음과 같은 에러가 발생한 경우,
"const char * 형식의 인수가 char * 형식의 매개 변수와 호환되지 않습니다"
프로젝트( 오른쪽 클릭 ) > 속성 > C/C++ > 언어 > 준수 모드 > 아니오로 바꿔주면 해결된다.
VS 2015에는 가능한데 VS 2017부터 준수 모드가 생겨서 생긴 문제이다. )
결과에서 보이듯이 객체의 소멸을 A형 포인터로 명령하니, A 클래스의 소멸자만 호출되었다.
따라서 strB가 남아있어, 메모리 누수가 발생하게 된다.
즉, 객체의 소멸과정에서는 포인터 변수의 자료형에 상관없이 모든 소멸자가 호출되어야 하는데
그 해결 방법이 가상 소멸자이다.
가상 함수와 동일하게 상속 구조의 맨 위에 있는 기초 클래스의 소멸자만 virtual 선언하면, 이를 상속하는 유도 클래스의 소멸자들도 모두 가상 소멸자로 선언이 된다. 그리고
가상 소멸자가 호출되면, 상속 구조의 맨 아래에 있는 유도 클래스의 소멸자가 대신 호출되면서, 기초 클래스의 소멸자가 순서대로 호출된다.
그리하여 메모리 누수 문제를 해결하게 된다.
'스터디 > C++' 카테고리의 다른 글
[ C++ ] 다중상속( Multiple Inheritance )과 가상상속( Virtual Inheritance ) (0) | 2019.10.10 |
---|---|
[ C++ ] 가상함수 테이블( V-Table ) (0) | 2019.10.10 |
[ C++ ] 가상 함수( virtual Function ) , 순수 가상함수( Pure Virtual Function ), 추상 클래스( Abstract Class ) (0) | 2019.10.10 |
[ C++ ] 함수 오버라이딩 (0) | 2019.09.26 |
[ C++ ] 클래스, 객체, 인스턴스 정리 (0) | 2019.09.26 |