深入理解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;
}
相关推荐
汉克老师8 小时前
GESP2026年9月认证C++二级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
Ai-_Man8 小时前
您您这可以把Dola的多个会话比如说。左侧的多个会话一次性导出吗?不是单条会话里面的多次会对话。用AI导出鸭,答案是可以的
开发语言·前端·人工智能·小程序
Java后端的Ai之路8 小时前
Python进阶探索23 - Python中的Time与Datetime模块
开发语言·数据库·python·datetime·time
沫璃染墨8 小时前
《从零入门Linux系统篇(五十四):线程篇·七——互斥锁底层原理:从原子交换到线程竞争与锁实现》
linux·运维·服务器·开发语言·c++·驱动开发·系统架构
Java后端的Ai之路8 小时前
Python进阶探索24_应用案例_linux系统的监控
linux·开发语言·python·应用·探索
程序员清风9 小时前
PydanticAI 实战:用类型安全构建可靠的 Python Agent
开发语言·python·安全
落魄实习生9 小时前
Agent Scope Java 2.x 系列【10】Middleware
java·开发语言·ai
Ramble_Naylor9 小时前
async/await:让一个线程同时等很多件事
开发语言·rust
可乐ea10 小时前
GitHub Security Lab 开源 Fuzzing Taskflow:让 LLM 智能体自己跑完 C/C++ 模糊测试
jvm·c++·github·模糊测试·mcp·代码agent·智能体自动化
迅猛龙办公室10 小时前
Python实现绘制同切圆
开发语言·python