P17C++析构函数

news2024/11/29 23:45:37

目录

前言

01 什么是析构函数

1.1 举个栗子

02 为什么要写析构函数


前言

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

与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统会自动执行析构函数。以C++语言为例:析构函数名也应与类名相同,只是在函数名前面加一个位取反符~,例如~stud( ),以区别于构造函数。它不能带任何参数,也没有返回值(包括void类型)。只能有一个析构函数,不能重载。如果用户没有编写析构函数,编译系统会自动生成一个缺省的析构函数(即使自定义了析构函数,编译器也总是会为我们合成一个析构函数,并且如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数再调用合成的析构函数),它也不进行任何操作。所以许多简单的类中没有用显式的析构函数。 

01 什么是析构函数

C++ 中的析构函数是一种特殊的成员函数,用于在对象的生命周期结束时执行清理操作。当对象的作用域结束、被 delete 或者程序结束时,都会自动调用其析构函数。

析构函数的作用是释放对象所占用的资源,例如动态分配的内存、打开的文件句柄、网络连接等。在析构函数中,可以编写必要的清理代码,确保对象所使用的资源得到正确的释放,从而避免资源泄漏和内存泄漏等问题。

当一个 C++ 对象不再被使用时,其所占用的内存需要被释放以免造成内存泄漏,析构函数就是用来释放对象所占用的内存的特殊成员函数。

1.1 举个栗子

让我们深入看一些例子。

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

P16 C++构造函数-CSDN博客

(上一章的代码) 

#include <iostream>

class Log
{ 
public:
    int maxSize;   
    int minSize;

public:
    Log(int max,int min) 
    {
        maxSize = max;
        minSize = min;
    }
    void print()
    {
        std::cout << maxSize << std::endl;
        std::cout << minSize << std::endl;
    }
};

int main()
{
    Log log(10,6);
    log.print();
    return 0;
}

在这个例子中我们创建了 Log类,这里还有一个带参数的构造函数。

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

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

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

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

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

运行代码之后,我们可以看到下面的结果,构造函数和析构函数都执行了

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

设置断点来调试一下,如果不知道如何设置断点debug调试的话,可以看我主页的博文

你会看到 Log的实例 log 被创建出来,也会打印created Log,最后作用域结束了,黄色箭头跳出函数的作用域,析构函数就被执行了,打印出delete Log。

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

这就是析构函数的本质。

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

02 为什么要写析构函数

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

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

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

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

最后附上本章使用过的代码

#include <iostream>

class Log
{ 
public:
    int maxSize;   
    int minSize;

public:
    Log(int max,int min) 
    {
        maxSize = max;
        minSize = min;
        std::cout << "created Log" << std::endl;
    }

    ~Log()
    {
        std::cout << "delete Log" << std::endl;
    }
    void print()
    {
        std::cout << maxSize << std::endl;
        std::cout << minSize << std::endl;
    }
};

void testLog()
{
    Log log(10,6);
    log.print();
}

int main()
{
    testLog();
    return 0;
}

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

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

相关文章

[LaTex]arXiv投稿攻略——jpg/png转pdf

一、将图片复制进ppt&#xff0c;右键单击图片选择设置图片格式&#xff0c;获取图片高度和宽度 二、选择“设计-幻灯片大小-自定义幻灯片大小” 三、设置幻灯片大小为图片大小 四、 选择“最大化” 五、 检查幻灯片大小是否与图像大小一致 六、导出为PDF

web前端之vue和echarts的堆叠柱状图顶部显示总数、鼠标悬浮工具提示、设置图例的显示与隐藏、label、legend、tooltip

MENU 效果图htmlJavaScripstyle解析 效果图 html <template><div><div><div id"idStackedColumnChart" style"width: 100%; height: 680px"></div></div></div> </template>JavaScrip export default {…

单细胞seurat入门—— 从原始数据到表达矩阵

根据所使用的建库方法&#xff0c;单细胞的RNA序列&#xff08;也称为读取&#xff08;reads&#xff09;或标签&#xff08;tags&#xff09;&#xff09;将从转录本的3端&#xff08;或5端&#xff09;&#xff08;10X Genomics&#xff0c;CEL-seq2&#xff0c;Drop-seq&…

Django(十一、auth认证模块)

文章目录 一、auth介绍auth认证相关模块及操作扩展auth_user表 一、auth介绍 Django自带一个admin路由&#xff0c;但是需要我们提供管理员账户和密码&#xff0c;如果想要使用admin后台管理&#xff0c;需要先创建表&#xff0c;然后创建管理员账户。 直接执行数据类迁移命令…

Redis:持久化RDB和AOF

目录 概述RDB持久化流程指定备份文件的名称指定备份文件存放的目录触发RDB备份redis.conf 其他一些配置rdb的备份和恢复优缺点停止RDB AOF持久化流程AOF启动/修复/恢复AOF同步频率设置rewrite压缩原理触发机制重写流程no-appendfsync-on-rewrite 优缺点 如何选择 概述 Redis是…

Kotlin应用——使用kt进行web开发 使用h2database进行初始化数据库 mybatis-plus使用

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 kt入门的合集文章如下&#xff1a; Kotlin学习——kt入门合集博客 &…

Node——Node.js基础

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境&#xff0c;它能够让JavaScript脚本运行在服务端&#xff0c;这使得JavaScript成为与PHP、Python等服务端语言平起平坐的脚本语言。 1、认识Node.js Node.js是当今网站开发中非常流行的一种技术&#xff0c;它以简单易…

Less 安装教程

文章目录 前言LESS的系统要求安装LESS例子输出Less编译css工具后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板…

一文从Vue2过渡到Vue3

文章目录 Vue3简介创建Vue3.0工程使用 vue-cli 创建使用 vite 创建Vue3工程结构变化 常用 Composition API拉开序幕的setupref函数reactive函数Vue3.0中的响应式原理vue2.x的响应式Vue3.0的响应式 reactive对比refsetup的两个注意点计算属性与监视computed函数watch函数watchEf…

强制删除文件

DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 强制删除文件,新建一个文本文件,将以上代码复制到文档中,保存,将文档重命名为delete.bat 如果弹窗提示修改后缀名可能导致文件不可用,也点击确认修改文件名称. 将需要强制删除的文件拖拽到这个delete.bat文件上,显示使用delete.bat打…

MetaObject-BeanWrapper-MetaClass-Reflector的关系

MetaObject、BeanWrapper、MetaClass、Reflector之间是通过装饰器模式逐层进行装饰的。其中MetaObject、BeanWrapper是操作对象&#xff1b;MetaClass、Reflector是操作Class ObjectWrapper类结构图 BaseWrapper是对BeanWrapper、MapWrapper公共方法的提取及类图的优化&#…

Jmeter接口测试快速入门 以飞致云平台为例

接口测试快速入门 以飞致云平台为例-CSDN博客 飞致云电商平台可以做接口测试练习。快速了解如何测试接口&#xff0c;如何做关联 系统基地址&#xff1a;https://gz.fit2cloud.com/ 接口测试快速入门 以飞致云平台为例-CSDN博客 博文中介绍了如何在swagger页面上进行接口测试。…

开发知识点-ArkTS-鸿蒙开发-Typescript

Typescript IED IED https://developer.harmonyos.com/cn/develop/deveco-studio/#download

【亚马逊云】基于EC2以 All-in-One 模式快速部署 KubeSphere 和 Kubernetes

文章目录 1. 云实例配置说明2. SSH连接云实例3. 查看系统版本4. 修改主机名5. 安装依赖项6. 安全组和DNS修改7. 下载KubeKey8. 同时安装Kubesphere和Kubernetes[可选]单独安装Kubernetes[可选]单独安装KubeSphere9. 验证KubeSphere安装结果10. 登录KubeSphere控制台[可选]安装K…

Less的函数的介绍

文章目录 前言描述style.less输出后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Sass和Less &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&#xff0c;…

C语言之内存函数

C语言之内存函数 文章目录 C语言之内存函数1. memcpy 使⽤和模拟实现1.1 memcpy 函数的使用1.3 memcpy的模拟实现 2. memmove 使⽤和模拟实现2.1 memmove 函数的使用2.2 memmove的模拟实现 3. memset 函数的使用4. memcmp 函数的使⽤ 1. memcpy 使⽤和模拟实现 函数声明如下&a…

文本转语音:微软语音合成标记语言 (SSML) 文本结构和事件

​ SSML 的语音服务实现基于万维网联合会的语音合成标记语言版本 1.0。 ​ 语音服务支持的元素可能与 W3C 标准不同。 每个 SSML 文档是使用 SSML 元素&#xff08;或标记&#xff09;创建的。 这些元素用于调整语音、风格、音节、韵律、音量等。 下面是 SSML 文档的基本结构…

【Amazon】通过直接连接的方式导入 KubeSphere集群至KubeSphere主容器平台

文章目录 一、设置主集群方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 二、在主集群中设置代理服务地址方式一&#xff1a;使用 Web 控制台方式二&#xff1a;使用 Kubectl命令 三、登录控制台验证四、准备成员集群方式一&#xff1a;使用 Web 控制台…

从源码重新真正认识RateLimiter(SmoothBursty实现)

前言 相信大家对于谷歌RateLimiter一定并不陌生,在项目中应该也经常拿来进行限流&#xff0c;但是对于其实现原理并不一定能用熟于心&#xff0c;本文带大家从源码探究RateLimiter的设计与具体实现。 RateLimiter的组成 从源码可以看到&#xff0c;RateLimiter由stopwatch与m…

隐写-MISC-bugku-解题步骤

——CTF解题专栏—— 题目信息&#xff1a; 题目&#xff1a;隐写 作者&#xff1a;CyberFl0wer 提示&#xff1a;无 解题附件&#xff1a; 解题思路&#xff1a; 这张图片一看&#xff01;哦呦~背景还是透明的&#xff0c;那我肯定要尝试给他换换色&#xff08;不可以色色.jpg…