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

C++ 析构函数基本概念

什么是析构函数

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

语法特点:

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

  • 没有参数,没有返回值

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

  • 不能是 staticconst

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

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;
}
相关推荐
滕州市燕猫虎计算机科技工作室个体工商户1 小时前
Java面试题汇总
java·开发语言
孙启超2 小时前
【AI开发之Rust】第 3 课:字符串与复合类型 —— 数据怎么放
开发语言·人工智能·后端·rust·llm·transformer
t-think2 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
cpp_learners2 小时前
C++ 实现责任链模式(Chain of Responsibility):从一堆 if-else 到可插拔的处理管道
开发语言·c++·责任链模式
郝学胜_神的一滴2 小时前
C++11 工程级应用 12:编译期类型魔法,干掉重复与臃肿的代码
c++·visual studio
君顾12 小时前
外卖CPS软件开发实战:从系统架构到部署全流程指南
java·开发语言·外卖
AIFQuant3 小时前
Python实时外汇行情接入实战:WebSocket与REST K线查询
开发语言·python·websocket
名字还没想好☜3 小时前
Java NIO ByteBuffer 实战:flip/clear/compact 三个绕晕人的方法与 position/limit 心智模型
java·开发语言·后端·spring·nio