71

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

例如:

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

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

当 main 返回或 C++11 中未定义顺序时,是先销毁x1还是先销毁?x2

4

6 回答 6

85

在每一类存储类中(动态分配的对象除外),对象以相反的构造顺序被销毁。

于 2013-02-04T14:00:33.443 回答
30

一、关于局部变量

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

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

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

二、关于你的例子

你的函数main()被称为:

  • x1在Stack上分配和构造,
  • x2在堆栈上分配和构造

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

  • x2被销毁并从Stack中释放,
  • x1被销毁并从堆栈中释放

三、而且

堆栈看起来像这样:

(使用方案似乎更容易理解堆栈的行为)

堆栈方案

于 2015-09-14T12:55:30.753 回答
7

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

于 2013-02-04T14:37:24.180 回答
4

它们以相反的分配顺序被销毁,请参阅这个 SO question。在这种情况下,这意味着x2将在 之前被销毁x1

于 2013-02-04T14:02:40.970 回答
2

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

于 2013-02-04T13:59:53.777 回答
2

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

isocpp.org 有一个关于这个主题的常见问题解答,它说它是以相反的顺序进行的。我认为当这个原始问题被问到时,官方网站并不存在。

于 2020-03-16T19:02:17.527 回答