由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - warning: returning address of local variable or temporary
相关主题
请教C++11的rvalue ref有关objec access path的问题
question about const referenceC++ 的 问题
再一个问题c++不用头文件,如何调用函数?C++
which style do you prefer?why copy assignment operator returns non-const type?
请问个c++ primer里面的小白问题.一个诡异的const_cast问题
C++ operator = overloading用copy & swap有啥优点C++ class cross reference problem
C++糟粕和需要避免的。C++ question
const int foo()啥意思?a simple C++ question
相关话题的讨论汇总
话题: warning话题: object话题: temporary话题: param话题: local
进入Programming版参与讨论
1 (共1页)
b***i
发帖数: 3043
1
我们项目中有很多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删掉后就不能正常使用了。
这种是不是得告诉公司,不能这么写啊?虽然现在没有问题,主要是这些代码没有被调
用过。
h**l
发帖数: 168
2
你是对的,这样做不对。
其实不用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)对象返回了引用是堆

y**b
发帖数: 10166
3
这是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.
h**l
发帖数: 168
4
也可能是被compiler直接inline了,这样就和招Bihai的人说的是一种情况。但我还是
觉得不用reference好一些。
b***i
发帖数: 3043
5
招我的人承认他说的不对了。这个应该是visual studio可能允许正常运行(没试过)
,但是gcc会出错。有的出segmentation fault, 有的是SIGSEGV, 有时候显示错误的
值。

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

b***i
发帖数: 3043
6
我发现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啥好处都没有啊。
: 如果这种错误还有人反对修改的话你应该考虑换个公司了,公司环境和同事水平对你影
: 响很大的。。。

p***o
发帖数: 1252
7
这明摆着不是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());
: }

b***i
发帖数: 3043
8
是吗?我们的VS为什么报warning呢?

【在 p***o 的大作中提到】
: 这明摆着不是return local stack object。
h**l
发帖数: 168
9
这个函数大多数时候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());
: }

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

object

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

1 (共1页)
进入Programming版参与讨论
相关主题
a simple C++ question请问个c++ primer里面的小白问题.
C++: define a reference always reference the same objectC++ operator = overloading用copy & swap有啥优点
[合集] C++: Is the temporary object automatically constC++糟粕和需要避免的。
请问C语言里这个写法是什么意思const int foo()啥意思?
请教C++11的rvalue ref有关objec access path的问题
question about const referenceC++ 的 问题
再一个问题c++不用头文件,如何调用函数?C++
which style do you prefer?why copy assignment operator returns non-const type?
相关话题的讨论汇总
话题: warning话题: object话题: temporary话题: param话题: local