可能重复: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 .
永远不应该返回引用或指向局部变量的指针 . 它会在函数返回时被销毁 . 它可能在某些情况下起作用,因为堆栈可能尚未被覆盖 . 但它最终会意外失败 .
将某事物的引用分配给相同类型的值是合法的 . 因此,在您的作业中,会制作副本 .
该值为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,这将是会发生什么:
调用
h(),将100写入内存,释放它并返回引用 .
h2()被调用并写入10 to the same place in memory (之前已被释放)
main()计算内存中相同位置的2个值的总和 . 因此,它是10 10 .
从 int & 设置 int 不是错误 . 这是一个有效的操作,意思是"take this reference to some object and copy whatever is there to my local variable" .
返回引用局部变量 - 对于Ivan /的单线程应用/示例是没有问题的 . 对于多线程应用程序是个问题 - 当不同的线程使用函数时,例如H() . 在这种情况下,当线程交叉使用未分配内存时可能是片刻 .
编译器不一定能防止错误和/或未定义的行为 .
检查您传递给编译器的选项 .
在codepad.org上编译代码会产生警告:http://codepad.org/ParI4AOG
In function 'int& h()': Line 6: warning: reference to local variable 'o' returned
5 回答
永远不应该返回引用或指向局部变量的指针 . 它会在函数返回时被销毁 . 它可能在某些情况下起作用,因为堆栈可能尚未被覆盖 . 但它最终会意外失败 .
将某事物的引用分配给相同类型的值是合法的 . 因此,在您的作业中,会制作副本 .
该值为100,因为包含它的内存刚刚被释放,没有人写任何内容 . 这是另一个例子:
如果你在Visual Studio上没有优化编译它,结果将是20,这将是会发生什么:
调用
h(),将100写入内存,释放它并返回引用 .
h2()被调用并写入10 to the same place in memory (之前已被释放)
main()计算内存中相同位置的2个值的总和 . 因此,它是10 10 .
从 int & 设置 int 不是错误 . 这是一个有效的操作,意思是"take this reference to some object and copy whatever is there to my local variable" .
返回引用局部变量 - 对于Ivan /的单线程应用/示例是没有问题的 . 对于多线程应用程序是个问题 - 当不同的线程使用函数时,例如H() . 在这种情况下,当线程交叉使用未分配内存时可能是片刻 .
编译器不一定能防止错误和/或未定义的行为 .
检查您传递给编译器的选项 .
在codepad.org上编译代码会产生警告:http://codepad.org/ParI4AOG