#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*,那么它不会被删除。我知道堆栈对象确实会被删除,但我还是个新手。
发布于 2019-03-29 02:57:04
想一想这里发生了什么
mini ret()
{
return *(new mini());
}ret()是一个按值返回mini的函数。
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() copy\n"; }
~mini() { cout << "~mini()\n"; }
};
class test
{
public:
mini ret()
{
return *(new mini());
}
};
int main()
{
test a;
a.ret();
cout << "end of block\n";
}打印
mini()
mini() copy
~mini()
end of block所以你是对的,原来的新mini永远不会被删除(泄露)。
发布于 2019-03-29 02:56:55
您将通过值返回mini,因此将为返回创建第二个实例(使用副本构造函数,不打印任何内容),然后在调用者丢弃它时销毁该实例。
https://stackoverflow.com/questions/55404913
复制相似问题