析构函数什么时候调用啊

 我来答
西西哩的小马甲
2018-03-30 · TA获得超过10.1万个赞
知道大有可为答主
回答量:39
采纳率:100%
帮助的人:1.7万
展开全部

调用时间:

1、对象生命周期结束,被销毁时;

2、delete指向对象的指针时,或delete指向对象的基类类型指针,而其基类虚构函数是虚函数时;

3、对象i是对象o的成员,o的析构函数被调用时,对象i的析构函数也被调用。

C++当中的析构函数格式如下:

如以下定义是合法的:

当程序中没有析构函数时,系统会自动生成以下析构函数:

<类名>::~<类名>(){},即不执行任何操作。

下面通过一个例子来说明一下析构函数的作用:

最后输出:析构函数被调用。

cin.get() 表示从键盘读入一个字符,为了让我们能够看得清楚结果。当然,析构函数也可以显式的调用,如 (*t).~T(); 也是合法的。

百度网友55b8c06db
2012-01-24 · TA获得超过340个赞
知道答主
回答量:60
采纳率:0%
帮助的人:70.3万
展开全部
在这个对象的作用域最后..

比如你在main里面声明了一个类A..那么~A()会在main结束时调用..
如果在自定义的函数f()里面声明了一个A 函数f结束的时候就会调用~A()

或者你delete 指向A的指针..
或者显式的调用析构函数
追问
也就是说在包含该对象的函数的末尾就会调用析构函数喽?
追答
是的....

局部的对象 在该对象声明的函数末尾被释放...

你可以看下作用域的定义..析构函数就是在对象的作用域的末尾释放

为了不误导人...我还是举个例子..

如果是
class A
{
....
}
void f()
{
A a;
//这种情况a的作用域就是整个函数 在f末尾释放
}
void f()
{
for(A a;a.yes();a++)//这里声明的是一个计数器a..(这种情况一般是迭代器)..
{
...
}
//这里是a作用域结束的时候 调用析构函数
}
void f()
{
A* p=new A;

delete p;//A作用域结束 调用析构
}

如果A是全局对象..那么就在程序末尾释放

显式的调用很少见..我就不举例了..
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
AirStorm
2012-01-24 · TA获得超过242个赞
知道小有建树答主
回答量:139
采纳率:0%
帮助的人:113万
展开全部
简单地说:析构函数是为你的类创建的对象处理后事用的,所以它的调用时机就类创建出来的对象的生命周期结束的时候。

举个例子:
class clsA
{
public:
clsA(){ }; // 构造函数
~clsA(){ }; // 析构函数
}

void main()
{
clsA a; // 上述构造函数被调用;
return; // 在这条语句执行之前,析构函数被调用,因为对象a死到临头了
}
追问
那就是在主函数结束时调用喽?
追答
这只是一个例子,在上述例子中,类claA的对象a的析构函数的调用时机,就是主函数结束的时候。但不是说所有的情况都如此。

意思是:只要你的类的对象完成了自己的任务,需要结束自己的生命周期的时候,就会调用析构函数。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
吴涛郦宕
2020-02-06 · TA获得超过1061个赞
知道小有建树答主
回答量:1260
采纳率:100%
帮助的人:5.2万
展开全部
析构函数对象生命周期结束,被销毁时调用。析构函数与构造函数相反,当对象结束其生命周期,如对象所在的函数已调用完毕时,系统自动执行析构函数。析构函数往往用来做“清理善后”的工作,例如在建立对象时用new开辟了一片内存空间,delete会自动调用析构函数后释放内存。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
撒菁淳于小琴
2020-01-01 · TA获得超过3652个赞
知道大有可为答主
回答量:3093
采纳率:25%
帮助的人:193万
展开全部
这么简单还用问?如果这些变量在堆栈中,一旦出了范围,析构函数将被调用,自动堆变量,你需要调用delete方法来释放资源此功能是释放资源退栈的过程或作业系统
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式