c++ 析构函数之虚函数

  之前面试的时候经常会问到关于C++中析构函数为什么会是虚函数的问题,虽然这个问题在面试中已经问烂了,但是这个问题在网上也并没有一个特别好的全面的解答,最近翻看effective c++,条款07解释的非常好,筛选出一部分分享给大家。

  当派生类对象经由一个基类指针被删除,而该基类的析构函数非虚,其结果未有定义:实际执行时通常发生的是对象的派生成分没被销毁,而派生类的析构函数未能执行起来,积累成分会被销毁,会导致内存泄漏,资源泄漏,败坏的数据结构等情况,给基类一个虚析构函数,可以防止析构的时候只析构基类而不析构派生类的状况发生,用基类的指针去操作继承类的成员,释放指针的过程中释放了继承类的资源,再调用基类的析构函数。

  如果一个类中不含有虚函数,令其析构函数是虚函数并不好,因为这样会增加内存开销。要实现出虚函数,对象必须携带某些信息,主要用来在运行期决定哪一个虚函数被调用。这份信息通常由vptr指针指出,每个对象都有一个vptr指针,指向一个由函数指针构成的数组,称为vtbl(虚表),每一个带有虚函数的类都有一个相应的虚表,当对象调用某一虚函数时,实际被调用的函数取决于该对象的虚指针所指的虚表:编译器在其中寻找适当的函数指针。

  如果无端定义虚函数,会导致增加指针数目进而增加内存开销,可能会影响传递至其他语言所写函数的可移植性,所以如果一个类不是作为基类使用,或不是为了具备多态性,就不该声明为虚析构函数。

转载于:https://www.cnblogs.com/tzxue/p/5485119.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值