【问题标题】:return reference to local variable [duplicate]返回对局部变量的引用[重复]
【发布时间】:2011-07-14 05:59:02
【问题描述】:

可能重复:
Can a local variable's memory be accessed outside its scope?!

这是一个代码:

    #include <iostream>
using namespace std;

double &GetSomeData()
{
double h = 46.50;
double &hRef = h;
return hRef;
}

int main()
{
double nonRef = GetSomeData();
double &ref = GetSomeData();
cout << "nonRef: " << nonRef << endl;
cout << "ref: " << ref << endl;
return 0;
}

nonRef 被打印为 46.5 ref 不正确。

第一个输出行为是正确的还是只是运气好?

谢谢

【问题讨论】:

  • 这已经被问过(不止一次)。 Accepted answer 收到了 1642 个赞(迄今为止)...
  • Eric Lippert 做了完美的类比。巧合的是,直到刚才我才阅读他的回答的第一条评论:)

标签: c++ compiler-construction pass-by-reference


【解决方案1】:

是的,你很幸运。

返回对局部变量的引用是未定义的行为。 未定义的行为意味着任何事情都可能发生,并且无法定义行为。

关于未定义的行为,

C++ 标准第 1.3.24 节规定:

允许的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(无论是否发出诊断消息),到终止翻译或执行(发出诊断消息)。

【讨论】:

    【解决方案2】:

    通常你使用 * 来声明一个指针变量,并在后面将指针解引用回原始变量。 & 从变量中返回地址

    我还没有对此进行测试,但是下面的工作是否更好?

    #include <iostream>
    using namespace std;
    
    double* GetSomeData()
    {
      double h = 46.50;
      return &h;
    }
    
    int main()
    {
      double nonRef = GetSomeData();
      double* ref = GetSomeData();
      cout << "nonRef: " << nonRef << endl;
      cout << "ref: " << *ref << endl;
      return 0;
    }
    

    【讨论】:

    • 你没有抓住重点。在这种情况下,使用引用还是指针无关紧要。
    • 将地址返回给局部变量是未定义的行为。未定义的行为意味着任何事情都可能发生,并且无法定义行为。
    【解决方案3】:

    如果您只是测试这两行之间的区别:

    double nonRef = GetSomeData();
    double &ref = GetSomeData();
    

    试试课程。

    class test
    {
    public:
        int x;
        int& getx()
        {
            return x;
        }
    };
    
    //Some code
    test c;
    int nonRef = c.getx();
    int &ref = c.getx();
    
    ref = 8;
    nonref = c.getx();
    

    此后,c.getx() 返回 8。

    【讨论】:

      最近更新 更多