7월 18, 2016

[EC++ 07] Declare destructors virtual in polymorphic base classes.

  • Partial destruction problem
  • Base class pointer로 derived 객체를 가르키고 있을 때, 객체가 해제되면 base class의 dtor가 call됨. 이 경우 derived 객체에서 base class 부분의 resource는 해제되지만 derived class의 resource가 해제되지 않아 resource leak 발생하는데, 이를 partial destruction이라고 함.

  • Partial destruction을 막는 방법
  • Base class 의 dtor를 virtual로 선언. 단, 어떤 클래스가 base class 로 쓰이지 않는데도 virtual detruction을 implementation하는 것은 좋지 않음. 클래스에 virtual function이 있는 경우 virtual function을 관리하는 vtbl("virtual table")을 가르키는 vptr("virtual pointer")를 객체가 가지게 되는데, 이 때문에 객체의 크기가 커지게 됨.

  • Destructor call order
  • Derived class의 destructor부터 call되고 base class의 dtor가 마지막에 call됨.


Summary

  • Polymorphic base classes should declare virtual desturctors. If a class has any virtual functions, it should have a virtual destructor.
  • Classes not designed to be base classes or not designed to be used polymorphically should not declare virtual destructors.

Reference

  • Effective C++ by Scott Meyers

댓글 없음:

댓글 쓰기