例如有一个类 s
class s{
public :
int a;
s() : a(998) {std::cout << "constructor of s" << std::endl; }
~s() {std::cout << "destructor of s" << std::endl; }
}
-----------------------------------
如果 s::s(); 这样调用构造函数后,析构函数紧接着就会被调用
另外~如果这样写:
s *sp = (s*)malloc(sizeof(s));
*sp = s::s(); //在这里,构造函数后也会立即执行析构函数
//注释1
std::cout << sp->a << std::endl; //这里将得到 998,而且即使在注释1的位置使劲往堆里扔数据这里也能得到正常的结果
delete sp; //这里会再次调用析构函数,即整个过程,调用1次构造函数2次析构函数
//但是如果这里用 free(sp) 则不会调用析构
不好意思,分用完了..
谢谢大家
C++中,直接调用类的构造函数的同时就会调用析构函数
答案:2 悬赏:50 手机版
解决时间 2021-03-08 18:31
- 提问者网友:精神病院里
- 2021-03-08 05:38
最佳答案
- 五星知识达人网友:执傲
- 2021-03-08 06:51
s::s();//构造一个临时的匿名对象,该对象在遇到分号后消亡
*sp = s::s(); //同上,这里s::s()构造的是匿名对象,遇到分号后消亡,
//s::s()的作用是用来做为中间量传给sp,但sp不会消亡
delete sp;//delete调用析构函数 free不会调用,这是常识若有不明白的,请追问,满意请采纳~
*sp = s::s(); //同上,这里s::s()构造的是匿名对象,遇到分号后消亡,
//s::s()的作用是用来做为中间量传给sp,但sp不会消亡
delete sp;//delete调用析构函数 free不会调用,这是常识若有不明白的,请追问,满意请采纳~
全部回答
- 1楼网友:duile
- 2021-03-08 08:29
c++程序子类析构时会调用父类的析构函数。
析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了定义一个对象时先调用基类的构造函数、然后调用派生类的构造 函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。
析构函数:
析构函数(destructor) 与构造函数相反,当对象脱离其作用域时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做“清理善后” 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯