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++ Primer阅读笔记:基础

阿花宝宝 Java基础笔记 之 引用类型作为参数

C语言局部变量与全局变量重名时的优先级问题(当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量)

C语言局部变量与全局变量重名时的优先级问题(当局部变量和全局变量同时存在的时候,优先引用局部变量,而不去引用全局变量)

C/C++: C++可调用对象详解

C++ 函数返回引用