深入理解C++ 析构函数<一>基本概念

C++ 析构函数基本概念

什么是析构函数

析构函数是类的一个特殊成员函数,在对象生命周期结束时自动被调用,用来做清理工作。

语法特点:

  • 名字是 ~ 加类名,比如 ~Foo

  • 没有参数,没有返回值

  • 一个类只能有一个,不能重载

  • 不能是 static、const

  • 如果不写,编译器会自动生成一个

cpp

复制代码
class Foo {
public:
    ~Foo();   // 声明
};

Foo::~Foo() { // 定义
    // 清理
}

什么时候被调用

场景 例子
局部对象离开作用域 { Foo f; }
delete 堆对象 delete p;
delete[] 数组 delete[] arr;
临时对象表达式结束 Foo()
异常栈展开 抛异常时局部对象被销毁

调用顺序:后构造的先析构(像栈一样),派生类先析构,再析构基类。

为什么需要析构函数

主要是为了释放对象持有的资源 ,比如堆内存、文件句柄、锁、socket。这种"构造时获取,析构时释放"的模式叫 RAII,是 C++ 资源管理的核心思想。

如果不写析构函数,new 出来的内存就可能泄漏。

cpp 复制代码
#include <iostream>

class IntArray {
public:
    // 构造函数:分配内存
    IntArray(int n) : size_(n), data_(new int[n]) {
        std::cout << "构造:分配了 " << size_ << " 个 int\n";
    }

    // 析构函数:释放内存
    ~IntArray() {
        delete[] data_;
        std::cout << "析构:释放了内存\n";
    }

    // 简单访问
    int& operator[](int i) { return data_[i]; }
    int size() const { return size_; }

private:
    int size_;
    int* data_;
};

int main() {
    std::cout << "--- 进入作用域 ---\n";
    {
        IntArray arr(5);

        for (int i = 0; i < arr.size(); ++i) {
            arr[i] = i * 10;
        }
        std::cout << "arr[3] = " << arr[3] << "\n";
    }   // 离开作用域,arr 的析构函数自动被调用
    std::cout << "--- 离开作用域 ---\n";

    return 0;
}
相关推荐
zhangdaliangmvp18 小时前
快速排序的学习理解:从基础分治到三路划分优化
c++·学习·算法
code2cat18 小时前
Java高级篇之JDBC:连接数据库,完成查询、更新与事务
java·开发语言·数据库
cu14319 小时前
细谈IT6563的具体功能与其应用
c语言·c++·单片机·嵌入式硬件
hzxxxz19 小时前
PHP引擎两个高危漏洞复盘:计数顺序与旧地址缺陷的机理与处置清单
开发语言·php
马立杰19 小时前
PHP 未授权 RCE 应急响应:CVE-2026-109618 CVE-2026-109619 排查与加固实战
android·开发语言·php
布莱克60519 小时前
C++ 内存泄漏全解析:常见场景、成因与规避实践
开发语言·c++·内存泄露
jimy119 小时前
lvalue、xvalue、prvalue(一):三者的分类
开发语言·c++
老王IT19 小时前
C#语言基础语法介绍
开发语言·c#
校园安全大脑平台20 小时前
校园安全平台过等保二级,开发阶段要注意什么
开发语言·安全·php
只睡四小时20 小时前
端侧推理:face-api.js 首屏 92% 是白下载的
开发语言·javascript·人脸识别·ecmascript·tensorflow.js·face-api.js·端侧推理