C++类的默认成员函数 —— 析构函数

2023-11-15

一、概念

析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

二、特征

析构函数是特殊的成员函数,其特征如下:

1. 析构函数名是在类名前加上字符 ~

2. 无参数无返回值类型。

3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构函数不能重载。

4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。  (出了作用域自动调用)

 三、下面用代码测试一下:

class Data
{
public:
	Data(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
	// 不需要写,默认生成的就够用,但是默认生成的也没做什么事情
	// 因为 year month day 都是在栈上开辟,函数调用结束就自己返还给操作系统,不需要自己去释放
	//~Data() // 析构函数
	//{
	//	// ~Data() 没有需要清理
	//	cout << "~Data()" << endl; // 虽然没用需要清理 但看是否会调用 ~Data() 函数
	//}

private:
	int _year = 1;
	int _month = 1;
	int _day = 1;
};

typedef int DataType;
class Stack
{
public:
	Stack(size_t capacity = 3)
	{
		_array = (DataType*)malloc(sizeof(DataType) * capacity);
		if (NULL == _array)
		{
			perror("malloc申请空间失败!!!");
			exit(-1);
		}
		_capacity = capacity;
		_size = 0;
	}

	void Push(DataType data)
	{
		_array[_size] = data;
		_size++;
	}

	// 需要显示写 手动释放资源
	~Stack() // 析构函数
	{
		free(_array);
		_capacity = _size = 0;
		_array = nullptr;
	}
private:
	DataType* _array;
	int _capacity;
	int _size;
};

class MyQueue {
public:
	void push(int x) {}
	// ...
	
	// 不需要写,默认生成的就够用,但是默认生成对于 Stack 自定义成员,调用 Stack 析构函数

private:
	size_t _size = 0;
	Stack _st1;
	Stack _st2;
};

void fun()
{
	//Data d1; // 打印了 ~Data()
	//Stack st;
	MyQueue q;
}

int main()
{
	fun(); 

	return 0;
}

所以根据上面测试的代码可知:

默认生成析构函数特点:跟构造函数类似:a.内置类型不处理 ;b.自定义类型成员回去调用他的析构。

如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数,比如 Date 类;有资源申请时,一定要写,否则会造成资源泄漏,比如Stack 类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++类的默认成员函数 —— 析构函数 的相关文章

  • 高级 Win32 图像文件 I/O?

    我想在 Windows C 应用程序中将图像文件读入内存 什么是一个相当简单的解决方案 也许类似于 IOS 提供的UIImage 我希望支持合理数量的文件格式 我需要为图像处理的位图提供一些低级访问权限 我在互联网上阅读了很多内容 看起来
  • 如何自定义 DataTable 列的排序

    我需要对数据表列的值进行排序 该列包含字符串 整数或混合文本 例如 数据表列包含如下值 23 18 12 store 23 store a1 1283 25 如果我使用对值进行排序Dataview sort 方法会按此顺序产生 12 128
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • 如何知道并加载特定文件夹中的所有图像?

    我有一个应用程序 C Builder 6 0 需要知道特定文件夹中的图像总数 然后我必须加载它们 在 ImageList 或 ComboBoxEx 中 或任何其他控件中 我怎样才能做到这一点 我知道如何在控件中加载图像 或保存在 TList
  • 实体框架代码优先 - 在另一个文件中配置

    使用 Fluent API 将表到实体的映射分开的最佳方法是什么 以便它全部位于单独的类中 而不是内联在 OnModelCreating 方法中 我目前在做什么 public class FooContext DbContext prote
  • __FUNCTION__ 宏的 C# 版本

    有人对 C FUNCTION 宏的 C 版本有好的解决方案吗 编译器似乎不喜欢它 尝试使用这个代替 System Reflection MethodBase GetCurrentMethod Name C 没有 LINE or FUNCTI
  • 阅读 Stack Overflow RSS 源

    我正在尝试获取未回答问题的列表the feed https stackoverflow com feeds 但我在阅读时遇到困难 const string RECENT QUESTIONS https stackoverflow com f
  • 控制台应用程序 .net Core 2.0 的配置

    在 net Core 1 中我们可以这样做 IConfiguration config new ConfigurationBuilder AddJsonFile appsettings json true true Build 这样就可以使
  • 如何避免选择项目时 winforms 树视图图标发生变化

    我正在一个小型 C Winforms 应用程序中尝试树视图 我已经以编程方式将 ImageList 分配给树视图 并且所有节点都很好地显示了它们的图标 but当我单击一个节点时 它的图标会发生变化 变为 ImageList 中的第一个图像
  • 根据拦截和返回值自动重试客户端WCF调用

    是否可以拦截 WCF 调用的结果并重试该操作 例如 操作的返回值可能包含状态代码 指示我传递到原始调用的会话令牌已过期 在这种情况下 我可以检索新的会话令牌并使用新的会话令牌重试调用 是否可以通过使用 WCF 拦截返回值 检查它 然后以对操
  • 推送 Lua 表

    我已经创建了一个Lua表C 但我不知道如何将该表推入堆栈顶部 以便我可以将其传递给 Lua 函数 有谁知道如何做到这一点 这是我当前的代码 lua createtable state libraries size 0 int table i
  • 如何在不使用reinterpret_cast的情况下使用dlsym()加载函数?

    我正在尝试使用 clang tidy 来强制执行 C 核心指南 虽然它确实有很多有效点 但有一件事我无法真正解决 dlsym 返回一个void 我需要以某种方式将其转换为正确的函数指针 为此 我使用reinterpret cast 由于指南
  • for 循环 - 没有效果的语句

    由于某种原因 我收到错误 statement with no effect关于这个声明 for j idx j lt iter j increment printf from loop idx i int idx punc ctxt j 你
  • 当格式字符串包含“{”时,String.Format 异常

    我正在使用 VSTS 2008 C Net 2 0 执行以下语句时 String Format 语句抛出 FormatException 有什么想法是错误的吗 这是获取我正在使用的 template html 的位置 我想在 templat
  • 在可观察项目生成时对其进行处理

    我有一个IObservable它会生成一次性物品 并且在其生命周期内可能会生成无限数量的物品 因此 我想在每次生成新项目时处理最后一个项目 因此Using http reactivex io documentation operators
  • Visual Studio 参考在多项目环境中未被复制

    我在 VS 2010 中有一个解决方案文件 其中有多个项目 现在 我有一个对该 dll 调用 MySql Data Entity dll 的引用 例如 我在解决方案中设置了以下项目 域 引用MySql Data Entity dll Dom
  • 局部静态变量初始化是线程安全的[重复]

    这个问题在这里已经有答案了 假设我有一个包含三个静态函数的类 如下所示 include
  • Windows 上 libcurl 的静态库[重复]

    这个问题在这里已经有答案了 如何将此库 libcurl 静态链接到 exe 我努力了 disable share enable static 没有帮助 我使用的是MingW32 有没有一种简单的方法来静态链接这个库 这样我的应用程序就不再有
  • ASP.NET Core:会话 ID 始终变化

    今天启动了一个全新的 ASP NET Core 网站 按照说明添加会话 我们在索引页上打印出会话 ID 它始终是唯一的 我认为这可能是 cookie 合规性 所以我在 Chrome 的高级设置和调试器中删除了所有 cookie 但横幅不会再
  • 当我读取 500MB FileStream 时出现 OutOfMemoryException

    我使用 Filestream 读取大文件 gt 500 MB 但出现 OutOfMemoryException 任何有关它的解决方案 我的代码是 using var fs3 new FileStream filePath2 FileMode

随机推荐

  • dev express 知乎_开发环境模拟开启HTTPS服务

    主要解决的问题 开发环境中 使用只支持 https 服务的Web API 例如 navigator clipboard 操作系统剪贴板 navigator mediaDevices 访问相机或麦克风等媒体输入设备 等 解决 Cookie 的
  • 服务器 备案 文档,自己的服务器 备案

    自己的服务器 备案 内容精选 换一换 弹性云服务器与传统硬件服务器一样 可以部署任意业务应用 例如 邮件系统 WEB系统 ERP系统等 弹性云服务器创建成功后 您就可以像使用自己的本地PC或物理服务器一样 在云上使用弹性云服务器 云手游服务
  • 移动端自动化测试

    Java和安卓环境安装和配置 安装java JDK 并配置环境变量 1 新建环境变量 JAVA HOME 2 新建环境变量 CLASS PATH JAVA HOME lib dt jar JAVA HOME lib tools jar 注意
  • Maven项目一直运行不出来但又没有报错

    导致原因 1 数据库无法正常连接上 2 注册中心连接不上 3 逆向工程生成的mapper出错 多次生成 解决办法 在无法运行出来的项目中添加log4j文件 再次运行 根据运行结果进行修改
  • 安装Android Studio2020.3.1.26 和 过程中遇到的各种问题

    学习视频 https www bilibili com video BV1Jb4y187C4 安装Android Studio 官网 安装地址 https developer android google cn studio 翻到最下面 有
  • C语言函数指针几个应用场景

    点击蓝字 关注我们 因公众号更改推送规则 请点 在看 并加 星标 第一时间获取精彩技术分享 来源于网络 侵删 函数指针是一种非常强大的编程工具 它可以让我们以更加灵活的方式编写程序 在本文中 我们将介绍 6 个函数指针的高级应用场景 并贴出
  • 删除闭包

    var foo function var n 0 return add function return n
  • mySQL (关系型数据库管理系统)

    MySQL是一个关系型数据库管理系统 由瑞典MySQL AB 公司开发 目前属于 Oracle 旗下产品 MySQL 是最流行的关系型数据库管理系统之一 在 WEB 应用方面 MySQL是最好的 RDBMS Relational Datab
  • 用C语言完整实现12种排序方法

    1 冒泡排序 思路 比较相邻的两个数字 如果前一个数字大 那么就交换两个数字 直到有序 时间复杂度 O n 2 稳定性 这是一种稳定的算法 代码实现 void bubble sort int arr size t len size t i
  • Spring Boot实现文件上传和下载

    实现Spring Boot文件上传和下载的步骤 1 文件上传 在pom xml文件中添加依赖 spring boot starter web和spring boot starter thymeleaf 创建一个上传前端的页面 包括一个表单来
  • 什么是住宅ip,静态和动态怎么选?

    上文我们介绍了数据中心代理 这次我们来介绍下住宅代理ip 住宅代理ip分类两种类型 静态住宅代理和动态住宅代理 他们有什么区别又能用在什么场景呢 我们先从他们是如何运作开始 一 什么是住宅代理ip isp住宅代理ip我们称为真人住宅代理 地
  • spring IOC流程图

    ioc核心 DefaultListableBeanFactory private final Map
  • 点云检测笔记2022

    目录 激光雷达综述 2022以前的点云检测 自动驾驶中的坐标系 Complex YOLOv4 激光雷达综述 百度安全验证
  • 记公司同事的一次集体活动

    花田游记 李维俊 杭州大区 风和日丽暖 春意现昂然 花田一日游 同事尽相伴 借着浓浓的春意在3月26日杭州大区组织到海上花田烧烤游玩 告别了城市的喧嚣 没有了工作的压力围绕在我们身边的只有体现同事之间紧密团队精神的欢声笑语 上午我们团队一行
  • Python优雅的日志——loguru

    loguru RECOMMENDATION 影视 loguru 据小提莫观察 在python的使用者中 善于聪明 偷懒 以及不重复造轮子已经成为大家的共识 正所谓 人生苦短 我用python 作为python的爱好者 肯定是喜欢python
  • 【分析】segments的version_map_memory指标具体表示什么?

    ES有很多的监控指标 其中有一些指标官方解释的实在模糊 比如version map memory byte units Total amount of memory used by all version maps across all s
  • JAVA 集合之迭代器Iterator

    Java语言中的Iterator功能比较简单 只能单向移动 它的主要功能有四种 1 凡是实现Collections接口的数据结构都可以使用该方法 第一次调用Iterator的next 方法时 它返回序列的第一个元素 2 使用next 获得序
  • 前哈工大教授开发的ChatALL火了!可同时提问17个聊天模型,ChatGPT/Bing/Bard/文心/讯飞都OK...

    丰色 发自 凹非寺量子位 公众号 QbitAI 今天的你 是否还在几个聊天大模型之间 反复横跳 毕竟各家训练数据和方法不尽相同 擅长和不擅长的东西也都不一样 现在 不用这么麻烦了 有人开发了一个名叫 ChatALL 的应用 可以将你的提问同
  • CTFShow Web7&Web8

    这两道题都是版本控制工具直接部署到生产环境中造成的信息泄露 所以在此一起总结 题目中给出了明显的提示 版本控制很重要 但不要部署到生产环境更重要 和备份文件泄露的题型一样 笔者自己的感觉是这种题型最常用的工具就是dirsearch 因此选择
  • C++类的默认成员函数 —— 析构函数

    一 概念 析构函数 与构造函数功能相反 析构函数不是完成对对象本身的销毁 局部对象销毁工作是由编译器完成的 而对象在销毁时会自动调用析构函数 完成对象中资源的清理工作 二 特征 析构函数是特殊的成员函数 其特征如下 1 析构函数名是在类名前