当前位置: 首页 > news >正文

C++析构函数详解

析构函数的作用

析构函数的主要作用是 释放对象持有的资源,而不是释放对象本身的内存空间。

  • 资源释放:如动态分配的内存(new)、文件句柄、数据库连接、网络套接字、锁等。

  • 对象内存空间:对象本身的内存(包括成员变量)由系统自动回收,析构函数不负责这部分。


析构函数的特性

  1. 命名规则

    • 析构函数名是 ~ + 类名,如 ~ClassName()

    • 无参数、无返回值(甚至没有 void)。

  2. 不可重载

    • 一个类只能有一个析构函数,不能重载(因为析构函数没有参数,无法区分不同的版本)。

  3. 默认析构函数

    • 如果未显式定义析构函数,编译器会自动生成一个 默认析构函数

    • 默认析构函数的行为

      • 对 内置类型(intfloat, 指针等)不做任何操作(不会自动释放它们指向的资源)。

      • 对 自定义类型成员,会调用其析构函数(递归执行)。

  4. 调用时机

    • 栈对象:离开作用域时自动调用。

    • 堆对象delete 时先调用析构函数,再释放内存。

    • 全局/静态对象:程序结束时调用。

  5. 内置类型 vs. 自定义类型

    • 内置类型:析构函数不会自动释放它们的资源(例如 int* p,析构函数不会 delete p,需要手动管理)。

    • 自定义类型:会调用其析构函数(例如类成员 std::string name,会调用 ~string())。

    • 对象内存释放

1. 堆对象(动态分配)

生命周期管理:

  • 手动分配:用 new 申请内存

  • 手动释放:必须用 delete 释放,delete的底层分两步,第一步调析构释放资源,第二步调free释放对象本身

2. 栈对象(自动管理)

生命周期管理:

  • 自动分配:在作用域内定义

  • 自动释放:离开作用域时,调用析构释放资源,然后释放对象本身,这个过程是编译器编好指令,操作系统执行

相关文章:

  • Synthesis的分类
  • cat file.tar.gz | tar -xzf - -C /target/dir两个减号之间为什么有个空格?是写错了吗?(管道命令后续)
  • JavaScript基础-赋值运算符
  • Windows 使用set和setx设置环境变量(skywalk3)
  • 区块链+IoT:创新场景落地背后的技术攻坚战
  • 驱动开发系列56 - Linux Graphics QXL显卡驱动代码分析(三)显示模式设置
  • Java 实现socket VAD通讯客户端
  • (35)VTK C++开发示例 ---将图片映射到平面2
  • 目标检测中的损失函数(三) | SIoU WIoUv1 WIoUv2 WIoUv3
  • 硬件性能与能效比竞赛:解码 PC 硬件的 “速度与激情”
  • 云计算-容器云-服务网格Bookinfo
  • 云计算-容器云-部署jumpserver 版本2
  • 推荐免费的RVC模型下载网站
  • 开源无人机地面站QGroundControl安卓界面美化与逻辑优化实战
  • 如何在NGINX中实现基于IP的访问控制(IP黑白名单)?
  • 解构区块链身份认证:从ID到零知识证明的实战指南
  • 2025年五一数学建模A题【支路车流量推测】原创论文讲解
  • 笔试专题(十四)
  • shell_plus
  • xshell 左边的会话管理器不见怎么办?
  • “名额5分钟抢完”,一场花费上万元:越野赛凭什么这么火?
  • 菏泽家长“付费查成绩”风波调查:免费功能被误读
  • 西湖大学2025年上海市综合评价招生简章发布
  • 辽宁辽阳市白塔区一饭店火灾事故举行新闻发布会,现场为遇难者默哀
  • 上海科创的三种品格
  • 哈莉·贝瑞、洪常秀等出任戛纳主竞赛单元评委