프로그래밍/Effective c++
7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 소멸자로 선언하자.
CuriousBear
2016. 3. 10. 13:50
1. 다형성 구조에는 가상소멸자를 쓰자.
A클래스 를 상속하는 B클래스의 객체를 A포인터로 받아 이 포인터를 delete하면,
A클래스의 소멸자가 불린 다음, A클래스의 소멸자가 virtual인 경우에 한해 B클래스의 소멸자도 불리게 된다.
따라서 A클래스의 소멸자가 비가상함수인경우 B의 객체를 A의 포인터로 delete할때 A만 소멸하고, B는 소멸하지 않는 "부분 소멸 상태"가 되어 메모리가 불어나기시작한다...
--> 다형성을 가진 기본 클래스의 경우 반드시 소멸자를 virtual로!
반면 상속시키지 않을 클래스인 경우(virtual 함수가 없는 경우)는 가상소멸자를 쓰는 것은 좋지 않다.
가상 소멸자 때문에 가상함수 테이블이 만들어져 클래스가 가상함수테이블 포인터를 가지게 되어 포인터 크기만큼 클래스 크기가 커지기 때문이다.
--> 무작정 가상소멸자를 쓰지는 말자.
2. 추상클래스에 순수 가상함수로 둘 것이 없으면 순수 가상소멸자를 두자.
순수 가상함수를 가지는 클래스는 추상클래스가 되어 객체를 생성할 수 없고, 상속만 가능하다. 이런 추상클래스를 만들고 싶은데, 마땅히 순수가상함수로 만들 함수가 없다. 이때 순수 가상 소멸자를 만들면 이것을 해결할 수 있다.
--> 추상클래스를 만들고자 할 때, 순수 가상함수로 둘게 없으면, 순수 가상소멸자를 만들자.
소멸자의 호출 순서를 보면, 파생클래스부터 기본클래스로 올라가면서 차례로 소멸자가 호출된다. 따라서 추상클래스에 순수 가상소멸자를 만들더라도 반드시 정의는 두어야한다.
--> 가상함수로 둘게 없어서 순수 가상함수로 만들게 없어서 소멸자를 순수로 만든것일 뿐이므로, 소멸자의 정의는 두어야한다.