Redian新闻
>
warning: returning address of local variable or temporary
avatar
b*i
2
我们项目中有很多warning,其中有大量我认为是错误的,比如
const MyClass& GetSome(){
return MyClass(... constructor);
}
这种虽说编译不出错,但是是不是不对?
我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
他说,这是extend the life time of temporary。
但是 我认为他说的 不对 。他说的 其实 是
const MyClasss& abc = someFunc(); // someFunc() returns an object
而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆
栈错误。这个我试过了,是Undefined。我同事有个演示,能正常使用。我把他
constructor里面的std::cout删掉后就不能正常使用了。
这种是不是得告诉公司,不能这么写啊?虽然现在没有问题,主要是这些代码没有被调
用过。
avatar
h*l
3
你是对的,这样做不对。
其实不用reference, RVO就可以用上了,用reference啥好处都没有啊。
如果这种错误还有人反对修改的话你应该考虑换个公司了,公司环境和同事水平对你影
响很大的。。。

【在 b***i 的大作中提到】
: 我们项目中有很多warning,其中有大量我认为是错误的,比如
: const MyClass& GetSome(){
: return MyClass(... constructor);
: }
: 这种虽说编译不出错,但是是不是不对?
: 我跟招我那个人讨论过,他说以前是编译直接出错,现在警告,但是C++11可以允许。
: 他说,这是extend the life time of temporary。
: 但是 我认为他说的 不对 。他说的 其实 是
: const MyClasss& abc = someFunc(); // someFunc() returns an object
: 而 例子 中 是返回一个引用,但是把刚刚构造的临时(rValue)对象返回了引用是堆

avatar
y*b
4
这是C++经典错误之一了,早年effective c++一书有详细解释:
Item 21: Don't try to return a reference when you must return an object
Never return a pointer or reference to a local stack object, a reference to
a heap-allocated object, or a pointer or reference to a local static object
if there is a chance that more than one such object will be needed.
avatar
h*l
5
也可能是被compiler直接inline了,这样就和招Bihai的人说的是一种情况。但我还是
觉得不用reference好一些。
avatar
b*i
6
招我的人承认他说的不对了。这个应该是visual studio可能允许正常运行(没试过)
,但是gcc会出错。有的出segmentation fault, 有的是SIGSEGV, 有时候显示错误的
值。

【在 h**l 的大作中提到】
: 也可能是被compiler直接inline了,这样就和招Bihai的人说的是一种情况。但我还是
: 觉得不用reference好一些。

avatar
b*i
7
我发现boost的库也是这样的,那它对吗?
template
inline
const typename lookup_named_param_def::type&
get_param(const Args& p, Tag){
return lookup_named_param_def::
get(p, param_not_found());
}

【在 h**l 的大作中提到】
: 你是对的,这样做不对。
: 其实不用reference, RVO就可以用上了,用reference啥好处都没有啊。
: 如果这种错误还有人反对修改的话你应该考虑换个公司了,公司环境和同事水平对你影
: 响很大的。。。

avatar
p*o
8
这明摆着不是return local stack object。

【在 b***i 的大作中提到】
: 我发现boost的库也是这样的,那它对吗?
: template
: inline
: const typename lookup_named_param_def::type&
: get_param(const Args& p, Tag){
: return lookup_named_param_def::
: get(p, param_not_found());
: }

avatar
b*i
9
是吗?我们的VS为什么报warning呢?

【在 p***o 的大作中提到】
: 这明摆着不是return local stack object。
avatar
h*l
10
这个函数大多数时候return的是caller函数传进去的参数,是没有问题的。也许在某种
特殊情况下会return param_not_found()这样一个default constructed local object
. 但我怀疑在实际使用中没有出现过这种情况。。。
你说这个boost库编译会有warning?

【在 b***i 的大作中提到】
: 我发现boost的库也是这样的,那它对吗?
: template
: inline
: const typename lookup_named_param_def::type&
: get_param(const Args& p, Tag){
: return lookup_named_param_def::
: get(p, param_not_found());
: }

avatar
C*r
11
被书本洗脑了吧 这不就是人家告诉你的extend var lifecycle么 谁告诉你effective
c++ 就是标准了
avatar
h*c
12
你返回的函数空间的引用,就是一个指针,
这个指针指向的内存被释放以后,被别的程序使用就是一个security hole.
这种问题,画c语言的stack图很好理解。实际应用我记得think in cpp 十要求返回必
须是const,不能是const &
avatar
b*i
13
既然有时候会返回一个临时的对象,那这个编译器的警告是应该的了?
看到微软的论坛上有人责问微软,微软说他们的编译器正确进行了警告。然后那个人说
,你们的警告信息太不清晰了。微软说要努力提高信息度。但是双方都认为这个boost
的库有问题。
虽然,这个param_not_found()是一个空的类的对象,什么信息也没有,所以估计也不
会有问题。但是我们要把警告当错误,这样就无法编译通过了吧

object

【在 h**l 的大作中提到】
: 这个函数大多数时候return的是caller函数传进去的参数,是没有问题的。也许在某种
: 特殊情况下会return param_not_found()这样一个default constructed local object
: . 但我怀疑在实际使用中没有出现过这种情况。。。
: 你说这个boost库编译会有warning?

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。