본문 바로가기
C,C++

[Effective C++] 항목 7: 다형성을 가진 기본클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.

by matters_ 2019. 7. 18.

Effective c++의 item을 간단히 정리하려고 한다.

오늘은 상속시키려는 클래스는 소멸자를 반드시 가상 소멸자로 선언해야만 한다는 주제에 대해 알아보기로 하자.

가상 소멸자로 선언해야 하는 이유는 파생 클래스에서 기본클래스의 포인터를 delete로 소멸시킬때 기본클래스만 소멸이 되고 파생클래스는 소멸이 안되어 메모리 누수현상이 발생한다.

따라서 상속시키려는 클래스는 소멸자를 가상함수로 사용해야 한다.

여기서 주의할 점은 가상함수를 C++에서 구현하면 클래스에 프로그램 실행중에 주어진 객체에 대해 어떤 가상함수를 호출해야하는지 결정하는 자료구조 vptr(가상함수 테이블 포인터 : virtual table pointer), vtbl(가상함수 테이블 : virtual table)가 별도로 들어가야 하기 때문에 용량이 늘어난다는 점이다.

따라서 상속시킬 클래스가 아니라면 가상함수로 내부함수를 구현하지 말자.

STL 컨테이너 타입 (vector, list, set, tr1::unordered_map) 은 소멸자가 가상으로 선언되어 있지 않기 때문에 파생클래스의 상속대상으로도 삼지 말아야하는 점 주의하자.

또한 다음과 같은 개념도 알아두면 좋다.

순수가상함수(Pure virtual function) : 구현이 없는 가상함수

추상 클래스(abstract fuction) :순수 가상함수를 하나 이상 포함하는 클래스

따라서 소멸자를 순수가상 소멸자로 두면 편리하게 쓸 수도 있다. 다만 추상 클래스에서 순수가상 소멸자의 정의를 반드시 구현하여야 한다는 점 잊으면 안된다. 

댓글