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;
}