【C++】 析构函数

析构函数的基本概念

什么是析构函数

析构函数(destructor)是一种特殊的成员函数,与构造函数功能相反。当对象结束其生命周期时(如对象所在的函数已调用完毕),系统会自动执行析构函数。析构函数主要完成"清理善后"工作,例如释放对象在生命周期中申请的资源。

析构函数的声明与定义

在C++中,析构函数的声明和定义遵循特定语法规则:

classClassName{public:~ClassName();// 析构函数声明};ClassName::~ClassName(){// 析构函数定义(函数体)}

析构函数的名称为类名前加波浪符(~),没有返回值类型,也不接受任何参数。

析构函数的特性与工作原理

核心特性

析构函数具有以下关键特性:

  • 与类名相同​​:在名称前加波浪符(~)以区别于构造函数
  • ​无参数无返回值​​:不能带任何参数,也没有返回值(包括void类型)
  • ​不可重载​​:每个类只能有一个析构函数
  • ​自动调用​​:由系统在对象销毁时自动执行,不能手动调用

默认析构函数

如果用户没有显式定义析构函数,编译系统会自动生成一个缺省的析构函数。这个默认析构函数不执行任何操作,仅提供基本的对象销毁机制。

值得注意的是,即使自定义了析构函数,编译器也总是会为我们合成一个析构函数。如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数,再调用合成的析构函数。

析构函数的调用时机

析构函数在以下情况下会被自动调用:

  1. ​局部对象​​:当函数执行结束,局部对象离开其作用域时
  2. ​全局对象​​:程序结束时,全局对象和静态对象的析构函数被调用
  3. ​动态分配的对象​​:使用delete运算符释放对象时
  4. ​临时对象​​:临时对象完成其使命后

析构函数的实际应用

资源管理

析构函数最常见的用途是释放对象在生命周期中申请的资源,如动态内存、文件句柄、网络连接等。
示例

#include<iostream>#include<cstring>classStudent{public:// 默认构造函数Student(constchar*name,int age){// 动态分配内存并复制字符串this->name =newchar[strlen(name)+1];strcpy(this->name, name);this->age = age;}// 析构函数~Student(){ std::cout <<"Destructor called for: "<< name << std::endl;delete[] name;// 释放动态分配的内存}// 显示学生信息voiddisplay()const{ std::cout <<"Name: "<< name <<", Age: "<< age << std::endl;}private:char*name;// 动态分配的字符串int age;};intmain(){{ Student student1("Alice",20);// 创建一个对象 student1.display();// 输出: Name: Alice, Age: 20}// student1的作用域结束,析构函数会被调用{ Student student2("Bob",22);// 创建另一个对象 student2.display();// 输出: Name: Bob, Age: 22}// student2的作用域结束,析构函数会被调用return0;}

这种资源管理方式是C++中RAII(Resource Acquisition Is Initialization)理念的核心实践,确保资源在使用完毕后被正确释放。

析构顺序

多个对象的析构函数调用顺序与构造函数调用顺序相反:​​最先构造的对象最后被析构​​,最后构造的对象最先被析构。

具体来说:

  • ​全局对象​​:在所有函数(包括main函数)执行之前构造,在main函数结束或调用exit函数时析构
  • ​局部自动对象​​:在建立对象时调用构造函数,函数调用结束时调用析构函数
  • ​静态局部对象​​:在程序第一次调用函数建立对象时调用构造函数,在main函数结束或调用exit函数时析构

重要注意事项与性能考量

析构函数的异常处理

析构函数不应抛出异常。如果析构函数中可能发生异常,必须在析构函数内部捕获并处理它们,避免异常传播到析构函数外部。因为当析构函数向外抛出异常时,将直接调用terminate()系统函数终止程序执行。

性能优化考虑

​平凡析构函数的优化​​:对于简单的类(仅包含基本类型成员),不定义析构函数或使用= default语法可以让编译器进行更多优化。

​避免不必要的析构调用​​:注意隐式拷贝和类型转换可能导致的不必要析构调用,例如在循环中使用适当类型的引用避免拷贝:

// 不推荐 - 可能引起不必要的拷贝和析构for(std::string s: vec){...}// 推荐 - 使用引用避免不必要的拷贝和析构for(const std::string& s: vec){...}

​智能指针的使用​​:合理使用std::unique_ptrstd::shared_ptr可以自动管理资源释放,减少手动析构的负担。

典型应用场景总结

下表总结了析构函数的主要应用场景:

场景类型描述示例
动态内存管理释放对象内部动态申请的内存delete[] ptr;
资源释放关闭文件、释放锁、断开网络连接等fclose(file);
日志记录对象销毁时记录日志信息输出调试信息
引用计数管理减少共享资源的引用计数--ref_count;

Read more

最新Python爬虫实战(入门爬虫篇)——案例14:某度热榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

最新Python爬虫实战(入门爬虫篇)——案例14:某度热榜数据采集(详细爬虫思路截图+抓包动图演示+完整爬虫代码+详细注释)

【爬取目标】 目标网站:某度热搜 在热点舆情分析、内容选题策划、SEO优化、新媒体运营等场景中,某度热榜是反映全网用户搜索焦点的核心数据源。手动整理热榜中的排名、标题、热度指数、描述等信息耗时且易出错,本文将教你使用 Python 编写爬虫程序,批量爬取某度热榜数据并自动保存到 Excel 文件,快速搭建专属热点信息库! 【实现效果】 代码实现批量爬取某度热榜榜单数据,整理结构化信息后存放到 Excel 文件中,包含热榜排名、热搜标题、热度指数、热搜描述、跳转链接等核心字段: 文章目录 * 一、技术栈和环境版本 * 二、爬虫实战分析 * 2.1 导入模块 * 2.2 分析网页 * 2.3 发送请求,获取网页源码 * 2.4 解析数据 * 2.5 存储数据

By Ne0inhk
告别手写SQL?Cursor智能生成实战指南与避坑技巧

告别手写SQL?Cursor智能生成实战指南与避坑技巧

文章目录 * 前言 * 一、 原理揭秘:Cursor 为什么比 ChatGPT 更懂你的数据库? * 1. 核心架构组件 * 2. 架构流程图解 * 二、 实战教学:从自然语言到高质量 SQL * 场景一:自然语言生成 SQL(Text-to-SQL) * 场景二:复杂 SQL 生成(窗口函数、CTE) * 场景三:SQL 转自然语言(代码解释与优化建议) * 三、 支持范围与边界:用实例说话 * 案例 1:ClickHouse 物化视图生成的“陷阱” * 案例 2:MongoDB 聚合管道的缺失阶段 * 小结 * 四、 避坑指南:如何让生成准确率达到 99%?(附真实案例) * 技巧一:拒绝“

By Ne0inhk
FARS全自动科研系统技术深度解析:从多智能体架构到工业化科研范式

FARS全自动科研系统技术深度解析:从多智能体架构到工业化科研范式

前言 2026年2月12日至2月22日,一场持续228小时33分钟的直播在全球AI社区引发了持续震荡。屏幕另一端,一个名为FARS(Fully Automated Research System)的全自动研究系统,在没有人类干预的情况下,自主完成了从文献调研到论文撰写的完整科研流程,最终产出100篇学术论文,总消耗114亿Token,成本10.4万美元。 这场实验的意义远不止于“AI写论文”的简单升级。它向世界展示了科学发现的根本范式正在发生转移——从依赖人类灵感的“手工作坊”,转向由AI驱动的“工业化流水线”。本文将从最底层的技术细节出发,逐层拆解FARS的系统架构、智能体协作机制、资源调度策略、成本控制模型,以及与竞品的技术对比,为读者呈现一个完整的全自动科研系统技术图谱。 第一章 系统总体架构:四智能体流水线设计 1.1 核心设计理念:研究系统的第一性原理 FARS的设计并非简单地模仿人类科研流程,而是基于团队对“研究系统”本质的重新思考。创始团队提出,一个理想的研究系统应遵循两条基本原则: 1. 高效拓展知识边界:系统的吞吐量应成为核心评估指标,而非单篇论文的完

By Ne0inhk

Flutter 三方库 functions_framework 的鸿蒙化适配指南 - 掌控云端函数架构、Serverless 微服务实战、鸿蒙级端云一体化专家

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 functions_framework 的鸿蒙化适配指南 - 掌控云端函数架构、Serverless 微服务实战、鸿蒙级端云一体化专家 【百篇巨献:第 100 篇博文里程碑】 在鸿蒙跨平台应用迈向“端云一体化”的征程中,如何快速、低门槛地编写能够运行在各种 Serverless 环境(如 Google Cloud Functions, Knative)的响应函数是每一位架构师的追求。如果你希望在鸿蒙项目中,利用一套极简、符合标准的函数式编程模型来处理 HTTP 请求或 Cloud Events。今天我们要深度解析的 functions_framework——由 Google 维护的标准化 Dart 云函数框架,正是帮你打通“鸿蒙端逻辑”与“

By Ne0inhk