2017-07-15 46 views
-4

我已经知道当程序离开它的范围时变量被销毁。然而,这似乎并没有发生,当我试图在下面的代码片断代码:返回一个局部变量的引用工作正常吗?

int& somethin() 
    { 
     int x1 = 4; 

     return x1; 
    } 
    int main() {  
     int x11; 
     x11 = somethin(); 
     cout << x11 << endl; 

     return 0; 
    } 

出人意料的是,输出结果是:4

而当我宣布“X11”作为参考变量,我得到垃圾值。

任何解释?

注:我重复这个试验了很多次。我不认为这是关于运气。 注意:在StackOverflow中有一个人问过同样的问题,答案是关于测试员是幸运的。

+0

想想执行堆栈在一台机器如何运作 - 大多数C++运行时环境不零出一个弹出堆栈帧,这就是为什么基准的目标值'4'仍然存在 - 但这并不意味着你应该依赖那种行为。 – Dai

+0

[我得到0](http://cpp.sh/243to) – yrHeTaTeJlb

+5

这是未定义的行为。这意味着任何具体的行为都不会发生。这就是为什么它很危险。 – StoryTeller

回答

3

任何解释?

行为是未定义的。

标准并不保证未定义行为会对您所期望的行为。它也不能保证行为总是一样的。在我的电脑上,结果是段错误。

对于它的价值,你能想象的实现:x1某处存储在内存中,所以值4是在内存中的某个地方。函数调用后,该内存不再用于x1,所以它可以用于别的东西。 x11存储在内存中的某处。如果恰好使用了相同的内存位置,那么该内存位置的垃圾值可能恰好为4.

虽然当我声明“x11”作为引用变量时,我会得到垃圾值。

4也是一个垃圾值。

1

局部变量存储在自动存储器中。当它们超出范围时,它们被销毁。

返回到一个本地变量的参考违反语言的规则,并因此是undefined behaviour(就像作为解引用nullptr)。

话虽这么说,没有关于x11的价值保证。它可以产生正确的结果,但这不是一种语言功能。

你可以找到更多关于undefined behaviour这里: What are all the common undefined behaviours that a C++ programmer should know about?

相关问题