-2

可能重复:
C++ 返回对局部变量的引用
可以在其范围之外访问局部变量的内存吗?

在下面的代码中

int& h() {

int o=100;
return o; 
}

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

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

4

5 回答 5

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

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

于 2012-06-26T18:15:39.427 回答
4

该值为 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。

int &设置int不是错误。这是一个有效的操作,意味着“将此引用引用到某个对象并将那里的任何内容复制到我的局部变量中”。

于 2012-06-26T18:33:33.280 回答
3

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

于 2012-11-28T09:53:20.390 回答
2

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

于 2012-06-26T18:03:22.100 回答
2

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

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

In function 'int& h()':
Line 6: warning: reference to local variable 'o' returned
于 2012-06-26T18:14:42.843 回答