c/c++整理--析构函数

c++中虚析构函数的作用是什么?

  析构函数是为了在对象不被使用后释放它的资源,虚函数是为了实现多态。那么,把析构函数声明为virtual有什么作用呢? 请看下面代码:


<span style="font-size:18px;">#include <iostream>  using namespace std;  class Base  
{  
public:  Base(){ }           //Base的构造函数  ~Base()             //Base的析构函数  {  cout<<"output from the destructor of class Base"<<endl;  }  virtual void Dosomething()  {  cout<<"do something in class Base"<<endl;  }     
};  class Derived : public Base  
{  
public:  Derived(){ }        //Derived的构造函数  ~Derived()          //Derived的析构函数  {  cout<<"output from the destructor of class Derived"<<endl;  }  void Dosomething()  {  cout<<"do something in class Derived"<<endl;  }  
};  int main()  
{  Derived *pt1 = new Derived();  pt1->Dosomething();  delete pt1;  Base *pt2 = new Derived();  pt2->Dosomething();  delete pt2;  return 0;  
}</span

程序输出:

<span style="font-size:18px;">do something in class Derived  
output from the destructor of class Derived  
output from the destructor of class Base  
do something in class Derived  
output from the destructor of class Base</span>
代码37行可以正常释放pt1的资源,但是代码41行并没有正常释放pt2的资源,从结果看,Derived类的析构函数并没有被调用。通常情况下,类的析构函数里面都是释放内存资源,而析构函数不被调用的话就会造成内存泄漏。原因是指针pt2是Base类型的指针,释放pt2时只进行Base类的析构函数。在代码第9行加上virtual关键字后
    do something in class Derived  output from the destructor of class Derived  output from the destructor of class Base  do something in class Derived  output from the destructor of class Derived  output from the destructor of class Base  

此时释放指针pt2时,由于Base的析构函数是virtual的,就会先找到并执行Derived类的析构函数,然后执行Base类的析构函数,资源正常释放,避免了内存泄漏。

  因此,只有当一个类被用来作为基类的时候,才会把析构函数写成虚析构函数。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/463240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多态情况下,怎么用基类指针去访问基类的虚函数?

class Base { // 基类 public:virtual void f() {cout<<"Base"<<endl;} }; class Derived : public Base { // 派生类 public:virtual void f() { // 最好加上该virtual cout<<"Derived"<<endl;} };int main(){Base* p new De…

2018-11-01 专栏一岁了-我为什么投身于普及用中文编程

知乎专栏于2017年11月9日开通, 之前只想写些中规中矩的年度小结, 但感觉有些东西不吐不快, 权当人生阶段报告吧. 最早对编程的接触在初中, 同学帮他家里玻璃厂写了个优化切割率的程序, 我看了点源码. 高中时想自学C未果. 00年大学志愿选了听起来和计算机很接近的信息工程专业, …

VB-VB.NET中 从字符串“XX”到类型“Double”的转换无效

最近在做一个vb.net写的一个网站&#xff0c;有一次同学有个问题问我&#xff0c;说程序总是抛出“从字符串“aa”到类型“Double”的转换无效”的错误。我过去一 看是个操作数据库的函数&#xff0c;我一开始想到的就是给参数赋值赋错了&#xff0c;引发的数据库的错误。然后就…

c++整理--函数重载

一、为什么C语言不支持函数重载而c能支持 什么是函数重载&#xff1f;为什么C语言不支持函数重载&#xff0c;而c能支持函数重载&#xff1f; 解析&#xff1a;函数重载是用来描述同名函数具有相同或者相似的功能&#xff0c;但数据类型或者是参数不同的函数管理操作。在C语言里…

Linux 灾难恢复 Linux 系统启动故障修复

#http://hi.baidu.com/winshining/item/3d964328e252b6cfdcf69aaa #http://www.verydemo.com/demo_c281_i514.html 简介&#xff1a; Linux 发行版本众多&#xff0c;现如今也得到了越来越广泛的应用&#xff0c;同时也面临着系统出现故障的潜在风险&#xff0c;本文将详细介绍…

EPOLLOUT/EPOLLIN事件触发的条件

1、EPOLLOUT事件触发的条件&#xff1f; (1)、一次write操作&#xff0c;写满了发送缓冲区&#xff0c;返回错误码为EAGAIN(11)。 (2)、对端读取了一些数据&#xff0c;又重新可写了&#xff0c;此时会触发EPOLLOUT。 简单地说&#xff1a;内核缓冲区由不可写变为可写时会触发…

08.Numpy数组迭代

一般迭代 NumPy包包含一个迭代器对象numpy.nditer。 它是一个有效的多维迭代器对象&#xff0c;可以用于在数组上进行迭代。 数组的每个元素可使用 Python的标准Iterator接口来访问。 使用arange()函数创建一个 3X4 数组&#xff0c;并使用nditer对它进行迭代。 示例 1 >>…

专家答疑:在ERP系统中确保销售订单准确性

若销售订单有错&#xff0c;如订单数量或者订单价格有问题的话&#xff0c;则会造成一系列的连锁反应。计划模块、采购模块、生产模块、库存模块等等都会受到牵连。而且最要命的是&#xff0c;很哪进行调整。所以&#xff0c;在ERP系统使用过程中&#xff0c;应该千方百计保障销…

hdfs为什么要用block以及block大小的设置

1、在HDFS里面&#xff0c;文件存储为什么要以Block块的方式存储&#xff1f; 目的&#xff1a;减少磁盘寻道的时间。 (1)、不设置block&#xff1a;因为数据是分散的存放磁盘上的&#xff0c;读取数据时需要不停的进行磁盘寻道&#xff0c;开销比较大。 (2)、使用block: 一次…

c++整理--虚函数

一、虚函数是这么实现的 解析&#xff1a;简单的说&#xff0c;虚函数是通过虚函数表实现的&#xff0c;那么什么是虚函数表呢&#xff1f;事实上&#xff0c;如果一个类中含有虚函数表&#xff0c;则系统会为这个类分配一个指针成员指向一张虚函数表&#xff08;vtbl&#xff…

[Linux] 命令行工具

1. 基本工具1.1 特殊字符shell的特殊字符有&#xff1a;&、;、|、*、?、、"、、[、]、(、)、$、<、>、{、}、^、#、/、\、%、!、~、。要将这些具有特殊含义的字符当作普通字符使用&#xff0c;可对它们转义使用&#xff0c;在特殊字符前加反斜杠" \ "…

【技术博客-总览--重要】

1 mayday05/technology-talk forked from aalansehaiyang/technology-talk https://github.com/mayday05/technology-talk/blob/master/middle-software/kafka.md 转载于:https://www.cnblogs.com/snowwhite/p/10504391.html

Python 代码调试技巧

Python 代码调试技巧 2012-5-3 简介&#xff1a; Debug 对于任何开发人员都是一项非常重要的技能&#xff0c;它能够帮助我们准确的定位错误&#xff0c;发现程序中的 bug。python 提供了一系列 debug 的工具和包&#xff0c;可供我们选择。本文将主要阐述如何利用 python debu…

谈谈JAVA中的安全发布

谈谈JAVA中的安全发布 昨天看到一篇文章阐述技术类资料的"等级"&#xff0c;看完之后很有共鸣。再加上最近在工作中越发觉得线程安全性的重要性和难以捉摸&#xff0c;又掏出了《Java并发编程实战》研读一番&#xff0c;这本书应该是属于为“JAVA 多线程作注解”的一…

微机原理8086CPU

8086CPU有14个寄存器&#xff1a;AX BX CX DX SI DI SP BP IP CS SS DS ES PSW寄存器16位&#xff0c;存放2个字节ABCDX为通用寄存器2^16-1最大数据存放8086上一代CPU中的寄存器都是8位 四个寄存器可以分为两个独立的8位寄存器使用分为AH、AL 高八位低八位数据最大存放16位822…

软件工程 - 设计模式学习之工厂方法模式Factory Method

在现实生活中我们可以看见,乐事在卖薯片,可比克也在卖.我敢肯定的说它们各自都有自己的工厂来生产薯片,而且生产出来的薯片味道还是不一样的.这就是我们这里所谓的工厂方法模式. 我们来看看这个模式的UML图: 这个模式中我们可以看到:产品和工厂2个基类,然后它们下面又有些子孙类…

一个简单的Makefile模板

FLAGS -Wall -g INCLUDE-I$(ACE_ROOT)/include ACE_LIB-L$(ACE_ROOT)/libN_LIB-lACEDD-DACE_HAS_EVENT_POLL Server:Server.o TaskWork.o  g -o Server Server.o TaskWork.o $(ACE_LIB) $(N_LIB) $(DD)Server.o:Server.cpp ClassDefined.h  g $(FLAGS) $(INCLUDE) $(DD) -…

new 与 malloc区别

new和malloc的区别 属性 new/delete是C关键字&#xff0c;需要编译器支持。malloc/free是库函数&#xff0c;需要头文件支持c。 参数 使用new操作符申请内存分配时无须指定内存块的大小&#xff0c;编译器会根据类型信息自行计算。而malloc则需要显式地指出所需内存的尺寸。 …

树莓派3B+学习笔记:4、查看GPIO

GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口。可以在终端重直接查看GPIO的定义。查看方式1&#xff1a;gpio readall 查看方式2&#xff1a; pinout 可以看出&#xff0c;这条命令执行后提示要查看更多信息访问pinout.xyz 转载于:https://w…

汇编语言基础知识点

汇编指令和机器指令一一对应&#xff0c;有编译器翻译识别&#xff0c;计算机无法直接识别一个存储单元等于1字节 1字节等于8位1KB1024Byte(字节)1Byte8bit&#xff08;位&#xff09;CPU中&#xff0c;指令和数据都是二进制形式存在磁盘的数据&#xff0c;CPU无法直接使用&…