在函数范围内在堆栈上分配的数组是否总是在离开函数时被释放?

Do arrays that get allocated on the stack within the scope of a function always get deallocated when leaving the function?

假设我有以下代码:

#include <iostream>
void f() {
  int arr[10];
}

int main() {
  f();
  f();
}

一旦我们离开 f() 的范围,数组 arr 是否会被释放,即使我们会再次调用它?另外,如果我们只调用 f() 一次,我假设它在离开 f() 的范围时被释放,但如果我错了,请有人纠正我。

我也意识到这可能是与编译器相关的问题,所以我将 g++ 作为标记包含在内。谢谢。

概念上确实如此,因为 arr 具有自动存储期限。 (例如,如果您要 return 一个指向该数组元素的指针,那么在调用者中取消引用该指针的行为将是未定义的。)

编译器是否根据 as-if 规则选择适当的优化是另一回事。

将 g++ 设置为 -O3,您可以预期将整个程序编译为 int main(){}。如果您有任何疑问,请检查生成的程序集。

参考:https://en.cppreference.com/w/cpp/language/as_if

你没有看错。每次调用函数时都会分配数组,每次函数结束时都会取消分配。虽然栈上的allocation/de-allocation本质上是免费的。同样使用 int 数组,您甚至不需要为元素上的 运行 构造函数付费。

除了@Bhathsheba 所说的之外,只要您超出内存(堆栈)不会自动失效的范围,它只是您可以根据其他要求自由删除堆栈。如果没有其他进程 运行,则堆栈可能不会被删除。所以要视情况而定。