在C ++中返回局部变量的引用

时间:2012-06-26 18:00:58

标签: c++ reference

  

可能重复:
  C++ Returning reference to local variable
  Can a local variable’s memory be accessed outside its scope?

在以下代码中

int& h() {

int o=100;
return o; 
}

int main() {
int t=h();     //line 1
cout<<t;     //line 2
return 0;
}

为什么输出为100,即函数的局部变量的值以及为什么第1行没有错误,因为函数的返回类型是int&amp;但我们将其返回值返回到int。

5 个答案:

答案 0 :(得分:5)

  1. 您永远不应该返回引用或指向局部变量的指针。它会在函数返回时被销毁。它可能在某些情况下起作用,因为堆栈可能尚未被覆盖。但它最终会意外失败。

  2. 将某事物的引用分配给相同类型的值是合法的。因此,在您的作业中会复制一份。

答案 1 :(得分:2)

值为100,因为包含它的内存刚刚被释放,没有人写任何内容。这是另一个例子:

int& h() {

    int o=100;
    return o; 
}

int& h2() 
{
    int o = 10;
    return o;
}

int main() {
    int t=h() + h2();     //line 1
    cout << t;
    return 0;
}

如果你在Visual Studio上没有优化的情况下编译它,那么结果将是20,这就是将要发生的事情:

  1. h()被调用,将100写入内存,释放它并返回引用。
  2. h2()被调用并将10 写入内存中的同一位置(之前已被释放)
  3. main()计算内存中相同位置的2个值的总和。因此,它是10 + 10。
  4. int&amp; 设置 int 不是错误。这是一个有效的操作,意味着“将这个引用带到某个对象并将其中的任何内容复制到我的本地变量中”。

答案 2 :(得分:2)

返回引用局部变量 - 对于Ivan /的单线程应用/示例是没有问题的。对于多线程应用程序是个问题 - 当不同的线程使用函数时,例如H()。在这种情况下,当线程交叉使用未分配内存时,可能是片刻。

答案 3 :(得分:1)

编译器不一定能防止错误和/或未定义的行为。

答案 4 :(得分:1)

检查您传递给编译器的选项。

在codepad.org上编译代码会产生警告:http://codepad.org/ParI4AOG

In function 'int& h()':
Line 6: warning: reference to local variable 'o' returned