析构函数是当对象要被释放掉时才会被调用,所以常被用来处理数据,例如释放堆区空间。
由此,可以得出析构函数释放时的三种情况:
1.正常情况
例:
#include <iostream> using namespace std; class Cstu { int a; Cstu():a(22) { cout << a << endl; a = 23; } ~Cstu() { cout << a << endl; } }; int main() { { Cstu stu; } system("pause"); return 0; }对象stu处于一个局部域内,当执行到22行的花括号时,执行析构函数,可用断点和控制台上输出的数值来验证。
2.处于带返回值函数的内
"return"相当于宣告函数已经执行结束,当执行到这一语句时,便会调用析构函数。
可用上述例子,减去"Cstu stu"两侧的花括号去做实验。
3.指针对象/堆区对象
即:
Cstu *p = new Cstu; delete p;因为delete的作用便是释放堆区空间,所以执行到delete时执行析构函数。
4.临时对象
Cstu();因为临时对象的作用域只是其所在的这条语句,所以当语句执行完毕前会调用析构函数。
另:1.只有new 和 delete 会分别触发构造函数和析构函数,malloc 和 free无法触发。
2.析构函数的形式只能是"~Cstu()",不能有参数,所以也无法构成重载函数。
3.当没有写析构函数时,系统会执行默认的析构函数,其内容为空。