自动解除分配内存时

  • 本文关键字:内存 解除分配 c++
  • 更新时间 :
  • 英文 :


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

何时自动释放内存?

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

函数结束时"a"会释放吗?

是的!

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

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

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

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

此外,仅仅因为它被解除分配并不意味着之后会自动清理内存。该值可能仍驻留在该内存中,直到重用该内存。

您的示例包含未定义的行为:

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

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

是的,

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

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

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

参考文献 1C++03 第 1.3.24 节:

允许的未定义行为包括完全忽略情况并产生不可预测的结果,在翻译或程序执行期间以环境特征的记录方式行为(发出或不发出诊断消息),到终止转换或执行(发出诊断消息)。

是的,分配给a的存储会在函数退出时解除分配。

最新更新