析构函数(Destructor)
eg: ~Book () { }
Rules:
- ~(tilde sign) 开头
- 和class名称一样
- 无返回值(和constructor一样)
- 不接受任何参数
- 是class的public member function
- 一个class只有一个destructor(constructor可以有多个)
- destructor不能手动的显式调用,它会在最后自动调用的
关于Destructor非常重要的一点:
在class中涉及到指针、动态内存分配(new操作符)时,必须要自行去定义析构函数了【加入delete操作】。同时,只要涉及到指针,也必须去定义copy constructor和assignment operator。否则,会引起memory leak。
关于在析构函数中的delete操作:
eg: ~Book () {
delete [ ] ptr;
ptr = nullptr;
}
基本用法:
1. 释放单个对象(可以是基本类型or类类型):delete 指针名
int* p = new int; // 动态分配一个整数
* p = 42;
delete p; // 释放分配的内存
p = nullptr; // 将指针设置为 nullptr 防止悬挂指针
2. 释放数组:delete [ ] 指针名
这里的数组,必须是new [ ] 这样创建的
int* arr = new int[10]; // 动态分配一个整数数组
for (int i = 0; i < 10; ++i) {
arr[i] = i * 10;
}
delete[] arr; // 释放分配的数组内存
arr = nullptr; // 将指针设置为 nullptr 防止悬挂指针
注意事项:
1. 防止悬挂指针: 在调用 delete
后,将指针设置为 nullptr
是一个好的实践,以避免悬挂指针(指向已释放内存的指针)
2. 避免重复释放内存: 重复调用 delete
或 delete[]
释放同一块内存会导致未定义行为,通常会导致程序崩溃。