C++析构函数何时会被调用?
首先定义了一个类叫做A,然后有一个函数Afunc(){Atmp;returnA;}在main里面有两句话:一个是func();另外一个是Aget=func();在A的构造...
首先定义了一个类叫做A,然后有一个函数
A func()
{
A tmp;
return A;
}
在main里面有两句话:
一个是
func();
另外一个是
A get = func();
在A的构造和析构函数中已经写好了相应的调试信息,发现只写func(),A会在func执行完毕后析构,而A get = func();执行完毕后对象A不会析构,而是等到整个main执行完毕后再析构,请问这是为什么?接受和不接受func()的返回值有这么大的区别吗? 展开
A func()
{
A tmp;
return A;
}
在main里面有两句话:
一个是
func();
另外一个是
A get = func();
在A的构造和析构函数中已经写好了相应的调试信息,发现只写func(),A会在func执行完毕后析构,而A get = func();执行完毕后对象A不会析构,而是等到整个main执行完毕后再析构,请问这是为什么?接受和不接受func()的返回值有这么大的区别吗? 展开
3个回答
展开全部
析构函数执行时机:1.当程序栈内对象被删除时
2.手动调用析构函数时
要更详细的理解机制,请尝试:
#include <iostream>
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.手动调用析构函数时
要更详细的理解机制,请尝试:
#include <iostream>
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
2015-12-26 · 知道合伙人教育行家
关注
展开全部
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2016-07-15 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
c++中的每个类都会有一个析构函数,当这个类的对象被销毁的时候,对象会自动调用析构函数。
跟据对象的声明方式分两种情况来讲:
1、动态声明的对象
这种声明方式下系统会自动销毁不再使用的对象,对应的对象的析构函数也会被调用。例如classname object;这样声明的对象,当程序运行到了对象作用域之外或者程序退出,对象都会被销毁,当然析构函数也会被调用。
2、静态声明的对象(new等)
这种声明方式下系统不会主动销毁对象,对应的析构函数也不会被主动调用,除非程序显式地调用delete等函数。这种情况下只要不去delete,对象的析构函数永远不会调用,即便这个对象的内存空间已经泄露或者程序退出。
跟据对象的声明方式分两种情况来讲:
1、动态声明的对象
这种声明方式下系统会自动销毁不再使用的对象,对应的对象的析构函数也会被调用。例如classname object;这样声明的对象,当程序运行到了对象作用域之外或者程序退出,对象都会被销毁,当然析构函数也会被调用。
2、静态声明的对象(new等)
这种声明方式下系统不会主动销毁对象,对应的析构函数也不会被主动调用,除非程序显式地调用delete等函数。这种情况下只要不去delete,对象的析构函数永远不会调用,即便这个对象的内存空间已经泄露或者程序退出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |