C++析构函数详解
析构函数的作用
析构函数的主要作用是 释放对象持有的资源,而不是释放对象本身的内存空间。
-
资源释放:如动态分配的内存(
new
)、文件句柄、数据库连接、网络套接字、锁等。 -
对象内存空间:对象本身的内存(包括成员变量)由系统自动回收,析构函数不负责这部分。
析构函数的特性
-
命名规则
-
析构函数名是
~
+ 类名,如~ClassName()
。 -
无参数、无返回值(甚至没有
void
)。
-
-
不可重载
-
一个类只能有一个析构函数,不能重载(因为析构函数没有参数,无法区分不同的版本)。
-
-
默认析构函数
-
如果未显式定义析构函数,编译器会自动生成一个 默认析构函数。
-
默认析构函数的行为:
-
对 内置类型(
int
,float
, 指针等)不做任何操作(不会自动释放它们指向的资源)。 -
对 自定义类型成员,会调用其析构函数(递归执行)。
-
-
-
调用时机
-
栈对象:离开作用域时自动调用。
-
堆对象:
delete
时先调用析构函数,再释放内存。 -
全局/静态对象:程序结束时调用。
-
-
内置类型 vs. 自定义类型
-
内置类型:析构函数不会自动释放它们的资源(例如
int* p
,析构函数不会delete p
,需要手动管理)。 -
自定义类型:会调用其析构函数(例如类成员
std::string name
,会调用~string()
)。 -
对象内存释放
-
1. 堆对象(动态分配)
生命周期管理:
-
手动分配:用
new
申请内存 -
手动释放:必须用
delete
释放,delete的底层分两步,第一步调析构释放资源,第二步调free释放对象本身
2. 栈对象(自动管理)
生命周期管理:
-
自动分配:在作用域内定义
-
自动释放:离开作用域时,调用析构释放资源,然后释放对象本身,这个过程是编译器编好指令,操作系统执行