函数返回问题

[复制链接]
1684|14
 楼主| sinadz 发表于 2012-6-12 17:13 | 显示全部楼层 |阅读模式
以下四种返回哪一种更加安全
A Get()
{
return A()
}
A
& Get()
{
return A()
}
A Get()
{
A a;
return a;
}
A
& Get()
{
A a;
return a;
}
zb0830 发表于 2012-6-12 17:43 | 显示全部楼层
个人感觉第三种。。。
秋天落叶 发表于 2012-6-12 18:08 | 显示全部楼层
1和3都安全,都返回局部变量的拷贝。
2和3都返回局部变量的引用,危险。
gxgclg 发表于 2012-6-12 18:22 | 显示全部楼层
2,3安全
1内存泄漏,4返回局部变量
无冕之王 发表于 2012-6-12 18:27 | 显示全部楼层
LZ可以自己做个程序测试一下
dfsa 发表于 2012-6-12 18:32 | 显示全部楼层
1和3是安全,返回的是临时对象的A拷贝,
将第2个改为:
const A& GetA()
{
return A();
}
可通过编译
eydj2008 发表于 2012-6-12 20:16 | 显示全部楼层
首先 写法上
A Get()
{
return A()
}
编译是不通过的。 A指什么? 函数名? 还是GET?
A& Get()
在这里你想表达什么意思?

排除 3 4 动态内存 做为返回量 是错误的。 至少需要加STATIC 静态变量
hgjinwei 发表于 2012-6-12 21:00 | 显示全部楼层
看到C++就烦
xsgy123 发表于 2012-6-13 16:16 | 显示全部楼层
最好的办法是自己测试一下
yybj 发表于 2012-6-13 16:26 | 显示全部楼层
首先 写法上
A Get()
{
return A()
}
编译是不通过的。 A指什么? 函数名? 还是GET?
A& Get()
在这里你想表达什么意思?

排除 3 4 动态内存 做为返回量 是错误的。 至少需要加STATIC 静态变量 ...
eydj2008 发表于 2012-6-12 20:16

分析的很有条理
火箭球迷 发表于 2012-6-13 16:34 | 显示全部楼层
1,3比较安全
yybj 发表于 2012-6-14 17:22 | 显示全部楼层
1和3都安全,都返回局部变量的拷贝。
2和3都返回局部变量的引用,危险。
秋天落叶 发表于 2012-6-12 18:08

分析正确,建议自己测试一下,印象更加深刻一点
baidudz 发表于 2012-6-14 18:03 | 显示全部楼层
1存在内存泄漏,4返回局部变量,不安全
john_lee 发表于 2012-6-15 02:23 | 显示全部楼层
1、3安全。1显然不可能有什么内存泄漏,3只是1的另外一种写法,但实际上就是1。
2在最新的C++11标准中非法,函数返回的是临时对象的引用,按C++11标准,临时对象属于“右值”,而“引用”只能用于“左值”,“常量引用”倒是能用于右值,但把函数改为const 引用后,又会出现“返回局部对象的引用”错误。
4也是错误的,但和2有一些区别,2是临时对象,是无名的,而4则是“具名”的,标准认为是左值,所以将直接出现“返回局部对象的引用”错误。
john_lee 发表于 2012-6-15 02:32 | 显示全部楼层
P.S.
C++11新增了语法:右值引用:“&&”。
3可以改为右值引用,把一个&改为两个&就行了,这可以避免产生引用非法的错误,但就3的情况来说,仍然会产生“返回局部对象的引用”的错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

304

主题

2313

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部