永发信息网

VC中析构函数的调用,高手请进!急~~

答案:4  悬赏:0  手机版
解决时间 2021-11-11 12:14
VC中析构函数的调用,高手请进!急~~
最佳答案
obj是一个局部变量,因此在函数末端就被销毁了,无法在把值传回,所以实际上将值返回给ret是用一个临时创建的对象执行的,并且在这个返回过程中是一个赋值行为.这个过程相当于这样:
MyClass temp = obj;
ret = temp;
最后temp和obj都会销毁,这就是为什么你会看到有两个析构函数执行,并且结果输出结果是10和9
我想你ret也应该是9吧
如果你返回值为引用或者指针,就不会出现这种情况了,不过如果你返回指针你得考虑返回的是否是一个空悬指针.
全部回答
对象值确是一样的 但不是同个对象
这样的
ret=MyFun(my);
这是值传,那么my要建立临时对象,在return的时候destruct
然后,这不是拷贝构造 而是赋值表达式,ret被赋值的时候 MyFun的返回值暂存在动态内存,也要需要释放,事实上是先赋值给ret再释放。在释放的时候自动调用析构destruct。
所以,两次析构
over
MyClass MyFun(MyClass &obj) //这里 改成引用方式
{
......
}

参数传递时,有一个复制的过程,产生一个临时对象。所以,析构的时候调用两次。
MyFun函数是复制了一个my 在函数结束后被析构掉了 可以理解为OBJ被析构掉了
这个过程中调用了2次构造函数 因为MY构造的时候是用MyClass(int i=0)这个构造函数
但是OBJ构造的时候用的是MyClass(MyClass & cp);
这个构造函数
所以析构OBJ的时候需要析构2次~
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
苏州市园愽园门票多少钱2o
徐克拍过的所有科幻电影
希望美术教育(烟台东华校区)地址有知道的么?
闺密头像 越多越好
炸芝麻球的技巧
金珠和赵丽蓉什么关系
老人四轮代步车可以上路吗要驾照,车要上排照
1.你假期去了哪里?2.你在假期干了什么?3.我昨
外人永远变不成内人
用钱能丢掉的东西都是垃圾是什么意思?
求画红色英语句子的翻译!
定远一共有多少所初中?
英语,,,,,,,,,,,,,,
旺族货运有限公司地址有知道的么?有点事想过
姓氏yun是哪个字
推荐资讯
我的机器可以玩显卡危机吗?孤岛危机!!!
蒜香蚝油腐竹怎么做好吃
渴死了,没有水怎么办!夜里
材料作文,是结合材料进行写作,还是提取材料
高铁福州到上海虹桥的1638次停靠站
这床单不知道买多大的,能不能目测一下
算命l985年7月25日晚上2时
古城驾校(喀什喀什)地址好找么,我有些事要过
麻辣金针菇是怎么做的
谁有天天爱消除闯了很多关的图片
书法古帖当中有些字旁边有三个点是什么意思?
杰出造型专业烫染地址好找么,我有些事要过去
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?