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