为什么此方法的返回被破坏
Why is the return of this method getting destructed?
#include<iostream>
using namespace std;
class mini
{
public:
mini() { cout << "mini()"; }
~mini() { cout << "~mini()"; }
};
class test
{
public:
mini ret()
{
return *(new mini());
}
};
int main()
{
test a;
a.ret();
cout << "end of block";
}
输出:
mini()~mini()end of block
为什么 ~mini(( 在块结束之前运行在这里?或者更确切地说是...如果我将方法的输出更改为 mini*,那么它不会被删除。我知道堆栈对象确实被删除了,但我是新来的。
考虑一下这里发生了什么
mini ret()
{
return *(new mini());
}
ret()
是一个返回mini
by-value 的函数。
new mini()
在堆上分配mini
。 return *(new mini());
按值返回它的副本。因此,打印的是堆上mini
的构造,以及在调用 ret()
的完整表达式末尾的堆栈上销毁其副本。
若要可视化它,请实现一个复制构造函数:
#include<iostream>
using namespace std;
class mini
{
public:
mini() { cout << "mini()n"; }
mini(const mini&) { cout << "mini() copyn"; }
~mini() { cout << "~mini()n"; }
};
class test
{
public:
mini ret()
{
return *(new mini());
}
};
int main()
{
test a;
a.ret();
cout << "end of blockn";
}
指纹
mini()
mini() copy
~mini()
end of block
所以你是对的,原始的新mini
永远不会被删除(泄露(。
您按值返回 mini,因此为返回创建第二个实例(使用复制构造函数,未打印任何内容(,并在调用者丢弃它时销毁。
相关文章:
- 从 C++ 中的函数返回此值
- 如何缩短此方法签名?
- Java 调用 dll 字符串返回类型方法
- 错误"pure virtual method called",当此方法已被覆盖时
- C++:为什么此方法每次都返回相同的随机数?
- 是否可以简化此方法以安装和导出基于 CMake 的项目?
- 如何调用返回类方法指针的类方法
- 我写了此方法来删除链接列表的重复元素,但它显示了分段故障,原因
- 此方法是否不适合在 std::unordered_map 中使用 2D 坐标作为键
- C++ shared_ptr从派生方法返回此值
- 使用 gmock 返回模拟方法参数
- 编译器是否能够内联此方法
- 为什么此方法的返回被破坏
- 如何编写此方法的定义,我收到错误
- 最后返回 *此C 会发生什么
- C++ 'php_sprintf'如何返回此值?
- 通过此方法删除链表中的数据会发生什么情况
- 当模板参数为std::vector时,如何创建此方法的模板版本
- 如何在方法中返回此值
- 超载操作员难题:返回 *此或临时变量