C++析构函数何时会被调用?

2024年11月28日 19:40
有3个网友回答
网友(1):

析构函数执行时机: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

网友(2):

析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

网友(3):

c++中的每个类都会有一个析构函数,当这个类的对象被销毁的时候,对象会自动调用析构函数。
跟据对象的声明方式分两种情况来讲:
1、动态声明的对象
这种声明方式下系统会自动销毁不再使用的对象,对应的对象的析构函数也会被调用。例如classname object;这样声明的对象,当程序运行到了对象作用域之外或者程序退出,对象都会被销毁,当然析构函数也会被调用。
2、静态声明的对象(new等)
这种声明方式下系统不会主动销毁对象,对应的析构函数也不会被主动调用,除非程序显式地调用delete等函数。这种情况下只要不去delete,对象的析构函数永远不会调用,即便这个对象的内存空间已经泄露或者程序退出。