VC中析构函数的调用,高手请进!急~~
答案:4 悬赏:0 手机版
解决时间 2021-11-11 12:14
- 提问者网友:你挡着我发光了
- 2021-11-10 12:30
VC中析构函数的调用,高手请进!急~~
最佳答案
- 五星知识达人网友:酒醒三更
- 2021-11-10 13:45
obj是一个局部变量,因此在函数末端就被销毁了,无法在把值传回,所以实际上将值返回给ret是用一个临时创建的对象执行的,并且在这个返回过程中是一个赋值行为.这个过程相当于这样:
MyClass temp = obj;
ret = temp;
最后temp和obj都会销毁,这就是为什么你会看到有两个析构函数执行,并且结果输出结果是10和9
我想你ret也应该是9吧
如果你返回值为引用或者指针,就不会出现这种情况了,不过如果你返回指针你得考虑返回的是否是一个空悬指针.
MyClass temp = obj;
ret = temp;
最后temp和obj都会销毁,这就是为什么你会看到有两个析构函数执行,并且结果输出结果是10和9
我想你ret也应该是9吧
如果你返回值为引用或者指针,就不会出现这种情况了,不过如果你返回指针你得考虑返回的是否是一个空悬指针.
全部回答
- 1楼网友:西风乍起
- 2021-11-10 17:13
对象值确是一样的 但不是同个对象
这样的
ret=MyFun(my);
这是值传,那么my要建立临时对象,在return的时候destruct
然后,这不是拷贝构造 而是赋值表达式,ret被赋值的时候 MyFun的返回值暂存在动态内存,也要需要释放,事实上是先赋值给ret再释放。在释放的时候自动调用析构destruct。
所以,两次析构
over
这样的
ret=MyFun(my);
这是值传,那么my要建立临时对象,在return的时候destruct
然后,这不是拷贝构造 而是赋值表达式,ret被赋值的时候 MyFun的返回值暂存在动态内存,也要需要释放,事实上是先赋值给ret再释放。在释放的时候自动调用析构destruct。
所以,两次析构
over
- 2楼网友:何以畏孤独
- 2021-11-10 16:01
MyClass MyFun(MyClass &obj) //这里 改成引用方式
{
......
}
参数传递时,有一个复制的过程,产生一个临时对象。所以,析构的时候调用两次。
{
......
}
参数传递时,有一个复制的过程,产生一个临时对象。所以,析构的时候调用两次。
- 3楼网友:执傲
- 2021-11-10 14:51
MyFun函数是复制了一个my 在函数结束后被析构掉了 可以理解为OBJ被析构掉了
这个过程中调用了2次构造函数 因为MY构造的时候是用MyClass(int i=0)这个构造函数
但是OBJ构造的时候用的是MyClass(MyClass & cp);
这个构造函数
所以析构OBJ的时候需要析构2次~
这个过程中调用了2次构造函数 因为MY构造的时候是用MyClass(int i=0)这个构造函数
但是OBJ构造的时候用的是MyClass(MyClass & cp);
这个构造函数
所以析构OBJ的时候需要析构2次~
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯