C++基础问题 需返回局部对象的引用时的处理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++基础问题 需返回局部对象的引用时的处理相关的知识,希望对你有一定的参考价值。
参考技术A 不能返回局部变量的引用,因为你返回了饮用后,你记录了他的信息,但当离开这个函数后,这个变量就失效了,这时候你获得的数据将无效,如果你使用这个变量进行操作,可能会造成内存崩溃。用new可以,但尽量不要,因为使用者不一定会记得删除这段内存,所以这时候必须使用返回值的方式。使用引用的话,就将这个引用放在参数里面,也可以
为啥 c++ 编译器不会警告返回对局部变量的引用?
【中文标题】为啥 c++ 编译器不会警告返回对局部变量的引用?【英文标题】:Why does c++ compiler not warn about returning reference to local variable?为什么 c++ 编译器不会警告返回对局部变量的引用? 【发布时间】:2019-03-23 14:32:43 【问题描述】:在下面的代码中,编译器会在调用 bar() 方法时警告返回对本地的引用。我也期待关于 foo() 方法的类似警告。
#include <iostream>
class Value
public:
int& foo()
int tc = 10;
int& r_tc = tc;
return r_tc;
int& bar()
int tc = 10;
return tc;
;
int main()
Value value;
int& foo_ref = value.foo();
int& bar_ref = value.bar();
std::cout << foo_ref << std::endl;
return 0;
编译输出:
g++ -c refreturn.cc -g -std=c++1z; g++ -o refreturn refreturn.o
refreturn.cc: In member function ‘int& Value::bar()’:
refreturn.cc:12:13: warning: reference to local variable ‘tc’ returned [-Wreturn-local-addr]
int tc = 10;
^
Compilation finished at Sat Mar 23 07:29:31
【问题讨论】:
如果您麻烦地设置自己的参考,它需要给您怀疑的好处。我认为你对编译器的要求太多了。 :) 从技术上讲,该标准在任何一种情况下都不需要警告。你很幸运,你的编译器在其中一个中给出了警告。它在bar()
中发出警告的原因是因为参与开发编译器的某人(或某些人)竭尽全力让它这样做。它没有在foo()
中发出警告的原因是因为还没有人竭尽全力让编译器发出警告。为什么有区别?因为编译器开发人员并不比其他人更完美。
What compiler? 不需要诊断任何一个错误。如果您认为应该修复编译器中的这个 QoA 问题,请提交错误。
@n.m.它是 g++ 编译器。
【参考方案1】:
“为什么 c++ 编译器不警告返回对局部变量的引用?”
因为编译器并不完美,最终您有责任不编写无效代码。编译器没有义务警告所有错误(事实上,它有义务警告非常少,但大多数尝试做得比最低要求更好)。
【讨论】:
事实上,警告是“乐观的”,以避免误报,与代码检查/静态代码分析器完全相反。以上是关于C++基础问题 需返回局部对象的引用时的处理的主要内容,如果未能解决你的问题,请参考以下文章
C语言局部变量与全局变量重名时的优先级问题(当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量)