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

【c++】析构函数

【c++】析构函数

1.命名规则:类名前加波浪号 ~,且无参数、无返回值

class MyClass {
public:
    ~MyClass(); // 析构函数声明
};
MyClass::~MyClass() { /* 释放资源 */ } // 类外定义

析构函数的核心作用

  • 释放资源:在对象生命周期结束时自动调用,用于释放对象占用的资源(如动态内存、文件句柄、网络连接等)。

能否重载:

析构函数不能重载,一个类有且仅有一个析构函数


默认析构函数

  • 自动生成:若未显式定义析构函数,编译器会生成一个默认析构函数。
  • 行为限制
    • 默认析构函数仅释放对象自身内存,不会处理动态分配的资源(如 new 分配的堆内存)。

何时需要自定义析构函数?

  • 资源管理:类持有手动分配的资源(如 new/malloc、文件句柄)时,需显式释放。
    class ResourceHolder {
    private:
        int* data;
    public:
        ResourceHolder(int size) { data = new int[size]; }
        ~ResourceHolder() { delete[] data; } // 必须自定义析构函数
    };
    

析构函数的调用时机

  • 局部对象:离开作用域时。
    {
        MyClass obj; // 构造函数调用
    } // 离开作用域时析构函数自动调用
    
  • 动态对象:通过 delete 释放时。
    MyClass* ptr = new MyClass();
    delete ptr; // 析构函数调用
    
  • 容器元素:容器(如 std::vector)销毁时,所有元素的析构函数被调用。

显式调用析构函数(不推荐)

  • 语法允许但风险高:可通过对象或指针直接调用析构函数,但需确保:
    • 不重复释放:避免多次调用导致未定义行为。
    • 手动管理内存:显式调用后需手动释放对象内存(如 operator delete)。
    MyClass obj;
    obj.~MyClass(); // 显式调用(危险!后续操作可能导致崩溃)
    

总结对比

特性析构函数
命名~类名()
数量唯一,不可重载
调用时机对象销毁时自动调用
默认行为释放对象内存,递归调用成员析构函数
自定义必要性需管理动态资源时
虚析构函数多态基类必须声明
显式调用风险需手动管理内存,易导致重复释放

常见错误

未释放动态内存

class LeakDemo {
private:
    int* buffer;
public:
    LeakDemo(int size) { buffer = new int[size]; }
    // 未定义析构函数!导致内存泄漏
};

http://www.kler.cn/a/536373.html

相关文章:

  • 离线安装Appium Server
  • BFS算法——广度优先搜索,探索未知的旅程(下)
  • DeepSeek-V3 与 DeepSeek R1 对比分析:技术与应用的全面解析
  • 013-51单片机红外遥控器模拟控制空调,自动制冷制热定时开关
  • 蓝桥杯备赛题目练习(一)
  • 【学Rust写CAD】3 绝对坐标系详解
  • pytest-xdist 进行多进程并发测试!
  • 团建 蓝桥杯省a 15
  • AI死亡脱离控制器
  • webpack配置方式
  • DeepSeek和ChatGPT的对比
  • Compose 面试题
  • 退格法记单词(类似甘特图)
  • profinet转ModbusTCP网关,助机器人“掀起”工业智能的惊涛骇浪
  • Kruskal算法求解最小生成树
  • SQLite更新版本
  • 深度剖析:电脑0x问题的根源及应对策略
  • java 网络安全感知 网络安全学java
  • Java实战经验分享
  • 讯飞绘镜(ai生成视频)技术浅析(五):视频生成
  • 从「Pied Piper」到「DeepSeek」:专精AI如何在巨头环伺中找到突破口
  • qtqtqtqtqtqtqtqtqtqtqt
  • 工业相机,镜头的选型及实战
  • 机器学习在癌症分子亚型分类中的应用
  • 组合(力扣77)
  • 网站快速收录:如何优化网站专题页面?