2012-04-28 46 views

回答

1

a在函数的作用域结束时被释放。

那么这个输出的原因是什么?
通过超出变量存在范围的内存位置的指针访问自动变量的内容是根据标准的未定义行为。

您的程序确实如此,所以它有一个未定义的行为(UB)。借助UB,您的程序可以显示任何有效或无效的行为参考文献1

注释1C++ 03部分1.3.24:

允许不确定的行为从范围与不可预测的结果完全无视的情况下,以在形成文件的翻译或程序执行期间表现(有或者没有发布诊断消息)的环境特征,终止翻译或执行(通过发布诊断消息)。

+0

未定义的行为!这是什么意思 ? – faressoft 2012-04-28 15:05:54

+0

@faressoft:[未定义的行为](http://en.wikipedia.org/wiki/Undefined_behavior) – 2012-04-28 15:15:14

+0

你的意思是在函数结束后内存中没有10的值吗? – faressoft 2012-04-28 15:39:22

1

是的,当函数退出时,分配给a的存储被取消分配。

2

从技术上讲,a存储在内存中的内存可供我们在其他情况下使用,因此回答您的问题,是的。

虽然这取决于一些因素。有可能甚至没有记忆可言。在您的特定示例中,优化器可能会将所有内容都截断。即使您执行类似cout << a的操作,也可以内联一个5,该内存不驻留在内存中。

请注意,如果您通过引用传递,则生命周期是原始变量的寿命周期。

此外,仅仅因为它被释放,并不意味着内存将在以后自动清理。该值可能仍然驻留在那里,直到该内存被重用。

你的榜样 exibits未定义行为:

void fun3(int *&p, int a){ 
     p = &a; 
} 

a是一个局部变量,你把它的地址,并将其分配给p,然后您可以在函数外使用。任何事情都可能发生。