#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 *,则不会将其删除。我知道堆栈对象确实会被删除,但我是新手。
答案 0 :(得分:8)
考虑这里发生的事情
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
。
答案 1 :(得分:0)
您将按值返回mini,因此将为该返回创建第二个实例(使用复制构造函数,未打印任何内容),然后在调用者丢弃它时将其销毁。