可能重复:
Can a local variable's memory be accessed outside its scope?
何时取消分配自动内存?
void fun3(int a){
a = 5;
}
当函数结束时'a'是否解除分配?
是的!
那么这个输出的原因是什么? http://ideone.com/2ZJ57
答案 0 :(得分:2)
从技术上讲,其他情境可以为我们提供存储a
的内存,所以要回答你的问题,是的。
这取决于一些因素。 可能甚至不能记忆。在您的特定示例中,优化器可能只是删除所有内容。即使您执行cout << a
之类的操作,也可能会内联5
,而不会驻留在内存中。
请注意,如果您通过引用传递,则生命周期是原始变量的生命周期。
另外,仅仅因为它被解除分配并不意味着之后会自动清理内存。在重用该内存之前,该值可能仍然存在。
您的示例表示未定义的行为:
void fun3(int *&p, int a){
p = &a;
}
a
是一个局部变量,您可以将其地址分配给p
,然后在函数外部使用它。任何事情都可能发生。
答案 1 :(得分:1)
当函数的范围结束时,将取消分配a
。
那么这个输出的原因是什么?
通过指向超出变量存在范围的内存位置的指针访问自动变量的内容是符合标准的未定义行为。
您的程序正是如此,因此它具有未定义行为(UB)。使用UB,您的程序可以显示任何行为有效或无效 Ref 1 。
参考1 C ++ 03第1.3.24节:
允许的未定义行为范围从完全忽略情况,结果不可预测,在翻译或程序执行期间以环境特征的文件化方式行事(有或没有发出诊断消息),终止翻译或执行(发布诊断信息)。
答案 2 :(得分:1)
是的,当函数退出时,为a
分配的存储将被释放。