0

可能重复:
可以在其范围之外访问局部变量的内存吗?

何时自动释放内存?

void fun3(int a){
    a = 5;
}

函数结束时“a”是否被释放?

是的 !

那么这个输出的原因是什么? http://ideone.com/2ZJ57

4

3 回答 3

2

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

不过,这取决于一些因素。甚至可能没有记忆可言。在您的特定示例中,优化器可能会删除所有内容。即使您执行类似的操作cout << a, a5也可能是内联的,它不驻留在内存中。

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

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

您的示例表现出未定义的行为:

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

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

于 2012-04-28T14:39:23.423 回答
1

a当函数范围结束时,Yes被释放。

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

您的程序正是这样做的,因此它具有Undefined Behavior(UB)。使用 UB,您的程序可以显示任何有效或无效的行为Ref 1

参考 1 C++03 第 1.3.24 节:

允许的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(发出的诊断消息)。

于 2012-04-28T14:38:06.073 回答
1

a是的,当函数退出时,分配的存储空间会被释放。

于 2012-04-28T14:39:12.950 回答