析构函数执行时机:1.当程序栈内对象被删除时
2.手动调用析构函数时
要更详细的理解机制,请尝试:
#include
using namespace std;
class Temp {
public :
Temp() { cout << "An object Temp build." << endl; }
~Temp() { cout << "An object Temp delete." << endl; }
Temp(Temp &A) { cout << "Copy from an object!Method 1!" << endl; }
void operator=(Temp &A) { cout << "Copy from an object!Method 2!" << endl; }
};
Temp test_a() {Temp test; return test; }
int main() {
Temp A;
Temp B = A;
Temp C(A);
Temp D = test_a();
return 0; }
程序运行结果因编译器而异,可能的结果如下:
An object Temp build. // A
An object Temp build. // B
Copy from an object!Method 2! // B=A
Copy from an object!Method 1! // C(A)
An object Temp build. // D
An object Temp build. // temp
Copy from an object!Method 2! // D=temp
An object Temp delete. // temp
An object Temp delete. // D
An object Temp delete. // C
An object Temp delete. // B
An object Temp delete. // A
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
c++中的每个类都会有一个析构函数,当这个类的对象被销毁的时候,对象会自动调用析构函数。
跟据对象的声明方式分两种情况来讲:
1、动态声明的对象
这种声明方式下系统会自动销毁不再使用的对象,对应的对象的析构函数也会被调用。例如classname object;这样声明的对象,当程序运行到了对象作用域之外或者程序退出,对象都会被销毁,当然析构函数也会被调用。
2、静态声明的对象(new等)
这种声明方式下系统不会主动销毁对象,对应的析构函数也不会被主动调用,除非程序显式地调用delete等函数。这种情况下只要不去delete,对象的析构函数永远不会调用,即便这个对象的内存空间已经泄露或者程序退出。