析构函数
概念
"析构函数"的作用类似于C语言的Destroy
,目的在于程序结束时,自动调用析构函数以释放内存空间,防止内存泄漏。
特性
- 无返回值类型(不能写void,就是什么都不写)
- 无参数
- 函数名前面加 " ~ "
- 函数名称与类名称相同
析构函数实现
class Date
{
public:
// 此处构造函数简略
Date(int* a, int size, int capacity)
{}
// 析构函数
~Date()
{
free(_a);
_a = nullptr;
_size = 0;
_capacity = 0;
}
private:
int* _a;
int _size;
int _capacity;
}
重点
- 如果没有显式析构函数,编译器会自动生成,内置类型不做处理,因为他们出了作用域会自动销毁。对于自定义类型,则会调用该类型的析构函数,若该类型没有定义显式析构函数,编译器也会自动生成。(可参照[[#^fa1578|构造函数]])但对于动态内存分配来说,如若没有显式析构函数,编译器不做处理,会造成内存泄漏。
- 析构函数可以手动调用,但是可能会导致未定义行为,因为程序结束时编译器还会调用一次。因此,可以在析构函数中给一个判断,如下面代码,这样可以避免访问空指针。
~Date()
{
if (_a) // 判断访问的对象是否为空指针
{
// 实现释放内存操作
}
}