c++ - 为什么这个方法的返回被破坏了?
问题描述
#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
按值返回的函数。
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
所以你是对的,原来的 new'dmini
永远不会被删除(泄露)。
推荐阅读
- android - Android Studio 3.6 canary 4 - Gradle 抛出 DefaultProjectSyncIssues 异常
- css - 为什么背景起源在体内不起作用
- flutter - 如何防止每次在flutter中点击底部导航栏页面时调用http请求?
- laravel - Laravel Websanova/Vue-Auth 登录/注册返回未定义的 URL
- android - 行小部件使用整个列
- python - 如何替换熊猫数据框中的数值?
- sql - 在一个联接中匹配多个列
- maven - `mvn clean install`一个che插件项目时“发现依赖问题”
- html - 悬停时更改图标
- c# - 使用内联 Lambda 函数作为参数