局部变量破坏顺序

在 C + + (11)中,局部变量释放的顺序是否定义好了? 更简洁地说: 在同一范围内两个局部变量的析构函数的副作用将以何种顺序变得可见?

例如:

struct X{
~X(){/*do something*/}
}


int main(){
X x1;
X x2;
return 0;
}

在 main 返回时,是先销毁 x1还是先销毁 x2,还是在 C + + 11中没有定义顺序?

23744 次浏览

它们将按照相反的建造顺序被摧毁。

在每个类别的存储类中(动态分配的对象除外) ,对象按照相反的构造顺序被破坏。

它们是按照反向分配顺序销毁的,请参阅 这个所以问题。在这种情况下,这意味着 x2将在 x1之前被销毁。

这是一个 Stack Data Structure行为,因此本地变量以 LIFO (Last-In-First-Out)数据结构的形式存储在 Stack 中,可以想象在 LIFO 数据结构中,最后添加到结构中的变量必须是第一个被删除的变量。变量是从 reverse order中的堆栈到它们的加法顺序的 removed

关于局部变量

  1. 局部变量在 Stack上分配。

  2. Stack基于 LIFO(Last-In-First-Out)模式。

  3. 因此,变量被销毁和释放的顺序与分配和构造的顺序相反。

关于你的例子

函数 main()被调用:

  • x1是在 Stack上分配和构建的,
  • x2是在 Stack上分配和构建的

当到达 main()函数范围的末端时:

  • x2被销毁并从 Stack释放,
  • Stack销毁和释放 x1

此外

Stack是这样的:

(通过一个方案,Stack的行为似乎更容易理解)

Stack scheme

Https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals

Isocpp.org 有一个关于这个主题的常见问题解答,它说它做 以相反的顺序。我认为,官方网站不存在时,这个原来的问题已经提出,虽然。