当前位置: 首页 > news >正文

面试(七)为什么一般希望将析构函数定义为虚函数

class B
{
public:~B()    // 基类析构函数不为虚函数{cout << "B::~B()" << endl;}
};class D : public B
{
public:~D(){cout << "D::~D()" << endl;}
};void Test(B* t)
{delete t;t = nullptr;
}int main()
{B *pb = new B;Test(pb);D* pd = new D;Test(pd);return 0;
}

简单梳理,B为基类,D为子类

在使用多态时,没有将B的析构函数定义为虚函数

 打印结果为:

修改代码,对基类析构函数引入virtual关键字修饰。打印结果为右下图:

现象:基类析构为虚函数时,当delete子类的对象指针时会同时调用基类的析构函数,然而上方没有对基类作为虚函数的例子不会对基类指针部分进行释放资源

结论:如果将基类析构函数定义为虚函数,则会避免执行某些操作时产生的资源泄露

        例如此处delete子类指针时,不仅会调用子类析构函数,而且也会调用基类析构,避免了内存泄露

class B
{
public:virtual ~B()    // 虚函数修饰基类析构函数{cout << "B::~B()" << endl;}
};class D : public B
{
public:~D(){cout << "D::~D()" << endl;}
};void Test(B* t)
{delete t;t = nullptr;
}int main()
{B *pb = new B;Test(pb);D* pd = new D;Test(pd);return 0;
}

http://www.lryc.cn/news/801.html

相关文章:

  • MySQL必会四大函数-时间函数
  • 震惊!邻桌的程序猿做可视化报告竟然比我还快,带着好奇心我打开了他的电脑,发现惊天秘密,原因竟是...
  • mathtype7与word冲突,无法安装,不显示工具栏的问题解决
  • IBM AIX 升级Openssh 实现篇(编译安装)
  • linux的睡眠框架及实现
  • Java面试知识点
  • PTA Advanced 1159 Structure of a Binary Tree C++
  • CDN绕过技术总汇
  • 算法训练营DAY51|300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组
  • mac:彻底解决-安装应用后提示:无法打开“XXX”,因为无法验证开发者的问题;无法验证此App不包含恶意软件
  • CPU 指标 user/idle/system 说明
  • Thinkphp大型进销存ERP源码/ 进销存APP源码/小程序ERP系统/含VUE源码支持二次开发
  • hgame2023 WebMisc
  • 67. Python的绝对路径
  • VHDL语言基础-组合逻辑电路-加法器
  • 内存检测工具Dr.Memory在Windows上的使用
  • J6412四网口迷你主机折腾虚拟机教程
  • 电子招标采购系统—企业战略布局下的采购寻源
  • elasticsearch 之 mapping 映射
  • 2023年rabbitMq面试题汇总2(5道)
  • 电视剧《狂飙》数据分析,正片有效播放市场占有率达65.7%
  • cas单点登录后重定向次数过多问题以及调试cas-dot-net-client
  • 【监控】Prometheus(普罗米修斯)监控概述
  • opencv+python物体检测【03-模仿学习】
  • 计算机科学基础知识第二节讲义
  • openssl genrsa 命令详解
  • C语言标准 —— C89(C90)、C99、C11、C17、C2X
  • 基于Java+Dubbo设计的智能公交查询系统
  • go语言的并发编程
  • 亚马逊要求UL94防火测试阻燃测试标准及项目