Effective c++ 条款7 为多态基类声明virtual析构函数


  • 问题:
    • 当一个base class指针指向子类对象,若base class带着一个non-virtual析构函数,此时delete base class指针时,只会释放掉base class对象的资源,并不会释放drived class对象的资源,最终造成内存泄漏
  • 解决:
    • 任何带有virtual函数的class都应有一个virtual析构函数
  • 虚函数实现原理:
    • 每个含有virtual函数的class都有指向虚函数表的指针(vptr)、虚函数表(vtbl)
    • 这个vptr指向对应class的vtbl
    • 当对象调用某个virtual函数时,编译器则根据对象的vptr实现动态绑定,找到对应class的vtbl,再在vtbl中寻找合适的函数指针
  • 只有当class内含有至少一个virtual函数时,才为它声明virtual析构函数
  • string和stl容器的析构函数都为non-virtual,最好不要作为base class使用
  • vtbl和vptr都会占用额外内存,因此不作为base class的class不要声明析构函数为non-virtual