022 - C++ 析构函数

news2024/12/24 0:34:13

上期我们讨论了构造函数。认识了它是什么以及如何使用它。如果你没有看上一期,那么你一定要回去看一下。

今天我们要讨论一下它的“孪生兄弟”,析构函数,它们在某些方面非常相似。

构造函数是你创建一个新的实例对象时运行,而析构函数是在销毁对象时运行。所以当一个对象要被销毁时,析构函数会被调用。

构造函数通常是用于设置变量或做任何你需要的初始化,对应的析构函数是用于卸载变量等东西,清理你使用过的内存。

析构函数同时适用于栈和堆分配的对象。如果你使用 New 分配一个对象,当你调用 delete 时析构函数也会被调用。而如果是一个栈对象,当作用域结束时栈对象会被删除,这时析构函数也会被调用。

例子时间

让我们深入看一些例子。

我们直接使用构造函数那一期中使用的代码。

ioFpEF.png

在这个例子中我们创建了 Entity 类,这里还有多个构造函数。

让我们再添加一个析构函数。

ioFgWQ.png

你可以看到,构造函数和析构函数在声明与定义时的唯一区别就是放在析构函数前面的波浪号。有了这个符号,你就知道这是析构了。

在这个例子中,我们只有一个简单的类,有两个成员X、Y。当我们为这两个浮点变量申请内存的时候,完全没有考虑之后怎么清除内存。在之后的系列中我们会继续讨论内存分配等所有这些复杂的问题。

继续。

ioFxpE.png

我们添加一条打印消息,用于告诉我们对象已经被删除。在构造函数中,我也添加了一条信息。删除第二个构造函数,这样我们就不会搞混了。

在主函数中,实例 e 是栈分配的,只有当主函数退出时,析构函数才会被调用,所以我们实际上不会看到,因为我们的程序会在那之后立刻结束。

为了看到这个过程,我要写一个函数 Function,它将执行 Entity 的相关操作。

ioF79C.png

运行代码之后,我们可以看到下面的结果。

ioFe4P.png

让我们更深入的看看它是如何工作的。

设置断点来调试一下。

ioFBTH.gif

你会看到 Entity 的实例 e 被创建出来,然后 X 和 Y 的位置被打印出来,最后作用域结束了,黄色箭头跳回到 Function 调用结束后的地方。

因为它的对象是在栈上创建的,当超出作用域时,它会被自动销毁。你可以看到当函数执行完成的时候,会输出删除 Entity 的信息,因为析构函数被调用了。

这就是析构函数的本质。

它只是一个特殊函数或特殊方法,在对象被销毁时被调用。

为什么要写析构函数

那么我们为什么要写析构函数呢?

因为如果在构造函数中调用了特定的初始化代码,你可能想要在析构函数中卸载或销毁所有这些东西。因为如果你不这样做,可能会造成内存泄露。

一个很好的例子是在堆上分配的对象。如果你已经在堆上手动分配了任何类型的内存,那么你需要手动清理。

如果在 Entity 类使用中或构造中分配了内存,你可能会要在析构函数中删除它们,因为当析构函数调用时,那个 Entity 实例对象会消失。

你也可以手动调用析构函数,不过我没见过很多人这样做,这样做有点奇怪。

如果你手工调用析构函数,我唯一能想到的这种情况是,如果你使用了new 来分配内存,然而当你delete 它时,你决定用 free 函数之类的东西,然后你也想手动调用它,这种情况很不常见。

你还可以像下面那样调用,就像它是任何其它函数一样。

ioFzNX.png

运行之后,你可以看到有两次删除的输出。

看起来我们并没有释放任何资源,所以它不会崩溃,只是打印了这条消息两次。——析构函数只是在对象被销毁时调用,不是调用了就一定销毁对象。

这种做法不是我推荐的,不建议大家这样使用。

析构函数就是这样。

大家有其他想法可以发在评论区哈,下期再见。

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

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

相关文章

无线测温系统在煤矿高压电气设备上的应用

摘要:随着社会经济的不断发展,电力系统向着高电压、高容量的方向前进着,电力系统全新的技术与设备层出不穷,电力的输送能力不断提升。然而,高压电气设备承载的高压电力负荷也让其自身的温升问题成为了威胁电网稳定的元…

张驰咨询:企业如何在不确定的环境中逆势增长?

企业不确定环境主要包括以下几个方面: 1、宏观经济环境的不确定性 包括国内外经济形势、政策调整、外汇汇率等因素的变化,会对企业的发展带来不确定性。 2、市场需求的不确定性 市场需求的变化,包括消费者需求、市场规模、市场结构等方面…

【自制键盘01】CH9329代码两则,让任何单片机都能做键盘

简介 CH9329是一款由WCH(Nanjing QinHeng Electronics Co. Ltd.)生产的USB转串口芯片,可以方便地将USB接口转换为串口接口,它在键盘设计这块可以实现作为MCU和电脑设备的“中间人”,把串口信号转换为按键。 引脚定义 …

如何实现电脑通过手机上网?1分钟搞定!

案例:电脑没网时,如何通过手机上网? 【想用电脑看电影,但是附近没有Wi-Fi。朋友说可以说电脑可以通过手机上网,但我们都不知道具体如何操作,有没有小伙伴可以教教我们。】 在没有Wi-Fi或有线网络接入时&a…

《Left ventricular hypertrophy detection using electrocardiographic signal》阅读笔记

论文的摘要 Left ventricular hypertrophy (LVH) indicates subclinical organ damage, associating with the incidence of cardiovascular diseases. From the medical perspective, electrocardiogram (ECG) is a low-cost, non-invasive, and easily reproducible tool th…

低代码平台-宜搭的核心概念

宜搭的核心概念 文章目录 全局变量基本的变量使用查看输出内容以及调试方式事件绑定页面生命周期条件渲染循环渲染自定义样式表单校验 全局变量 在左侧数据源中添加变量,添加变量的写法和js的写法一致。 基本的变量使用 给文本绑定数据源,点击左侧刚才定…

蒸发器前氟离子超标的解决方法

深度除氟工艺 1、活性氧化铝:需PH调整至酸性 2、碳基/羟基磷灰石:再生次数有限制 3、反渗透膜:造价成本高 4、特种除氟树脂:预处理需做好 氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性…

LVS负载均衡之DR模式

DR调度服务器 192.168.255.128 Nginx节点服务器1 192.168.255.130 Nginx节点服务器2 192.168.255.131 统一虚拟ip(vip) 192.168.255.188 访问客户端 192.168.255.134 第一步首先关掉所有虚拟机的防火墙 systemctl stop firewalld.service setenfor…

Maya - 后缀为xgen文件导出到虚幻引擎

Xgen是集成在Maya中的工具,可以在指定模型表面生成和控制大量物体的集成和离散;经常用于复杂的毛发制作,可以方便的用笔刷等控制曲线(curves)和导引线(guides)等线条来控制毛发的走向&#xff1…

【MySQL】插入文件路径,反斜杠消失

系列文章 C#底层库–MySQL脚本自动构建类(insert、update语句生成) 本文链接:https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库访问操作辅助类(推荐阅读) 本文链接:h…

克隆Linux系统(centos)

克隆前得保证你有一台Linux系统的虚拟机了。 如果没有,可以参考这篇文章: 安装VMware虚拟机、Linux系统(CentOS7)_何苏三月的博客-CSDN博客 按照示意图一步一步执行即可。 克隆前先关闭运行的虚拟机系统。 然后右键已安装的虚拟…

看完就懂的vue2与vue3响应式的区别

一、前言 数据响应式 所谓数据响应式就是建立响应式数据与依赖(调用了响应式数据的操作)之间的关系,当响应式数据发生变化时,可以通知那些使用了这些响应式数据的依赖操作进行相关更新操作,可以是DOM更新,也…

视频音频提取器推荐:快速提取视频中的音频!

视频中的音频可以用于很多用途,比如制作配乐、音频剪辑等。但是,许多人并不知道如何将视频中的音频提取出来。如果您也是这样的情况,那么本文为您介绍一个简单易用的视频音频提取器:。 它是一个免费的在线工具,可以帮…

【Android FrameWork(一)】- 启动程序 init

文章目录 背景源码分析(第一个启动程序 init)1.main.cpp2.init.cpp3.property_service.cpp4,LoadBootScripts 拓展知识Android的架构图I/O多路复用 总结 离职找工作间隙,停下脚步整理下自己的知识体系,把之前忙于开发未曾整理的知…

SOLIDWORKS Electrical无缝集成电气和机械设计

集成电气系统设计SOLIDWORKS⑧Electrical 解决方案借助专为工程专业设计的特定工具简化了电气铲品设计,并借助直观的用户界面更快地设计嵌入式电气系统。 与SOLIDWORKS 3DCAD的原生集成能提供更好的协作与生产效率,同时减少产品延迟、提高设计的一致性与…

微信小程序nodejs+python+php+springboot+vue 法律知识分享科普系统平台

要想实现法律知识分享平台的各项功能,需要后台数据库的大力支持。管理员验证注册信息,收集的信息,并由此分析得出的关联信息等大量的数据都由数据库管理。本文中数据库服务器端采用了Mysql作为后台数据库 紧密联系起来。在设计过程中&#xf…

从零开始,轻松入门React - 构建现代Web应用的利器!

文章目录 前言渲染 React 组件使用 JSX传递属性(Props)处理组件状态(State)处理用户输入(事件处理)组合和嵌套组件写在最后 前言 React 是一种由 Facebook 开发的流行的 JavaScript 库,用于构建…

通用人工智能+智能车舱,商汤绝影带来怎样一番景象?

本文来源:智车科技 / 导读 / 进入4月,中国科技圈迎来最卷的时刻,这可能中国AI史上一个重要节点。ChatGPT、GPT-4的出圈掀起了通用人工智能(AGI)的技术狂潮,引爆了一场以大模型为代表的生成式AI狂飙&#x…

【基础】Kafka -- 日志存储

Kafka -- 日志存储 日志文件目录日志索引偏移量索引时间戳索引 日志清理日志删除基于时间基于日志大小基于日志起始偏移量 日志压缩 日志文件目录 Kafka 中的消息以主题为单位进行基本归类,而每个主题又可以划分为一个或者多个分区。在不考虑多副本的情况下&#x…

Adobe Photoshop 软件下载

Adobe Photoshop,简称“PS”,是由Adobe Systems开发和发行的图像处理软件。Photoshop主要处理以像素所构成的数字图像。 时至今日,Adobe Photoshop 已经成为当今世界上最流行、应用最广泛的图像处理软件。不但设计专业的学生要系统的学习这个…