C ++局部变量销毁顺序

时间:2013-02-04 13:58:00

标签: c++ c++11 destructor local-variables

是否存在在C ++(11)中解除分配局部变量的已定义顺序? 更简洁:在同一范围内两个局部变量的析构函数的副作用会以哪种顺序变为可见?

e.g:

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

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

主要返回时是x1还是x2是否被销毁?或者C ++ 11中的订单是否未定义?

6 个答案:

答案 0 :(得分:58)

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

答案 1 :(得分:21)

<强>予。关于本地变量

  1. 局部变量分配在堆栈

  2. 堆栈基于LIFOLast-In-First-Out)模式。

  3. 因此,变量会按照分配和构造的相反顺序销毁和解除分配。

  4. <强> II。关于您的示例

    您的函数main()被称为:

    • x1 Stack
    • 上分配和构建
    • x2 Stack
    • 上分配和构建

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

    • x2堆栈中销毁并取消分配,
    • x1已从堆栈
    • 中销毁并取消分配

    <强> III。此外

    Stack 如下所示:

    Stack 的行为似乎更容易用方案理解)

    Stack scheme

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

答案 4 :(得分:2)

它们将按照相反的构造顺序销毁。

答案 5 :(得分:0)

How to embed Tcl in C applications

isocpp.org有一个有关此主题的常见问题解答,并说它以相反的顺序。我认为当提出这个原始问题时,官方网站就不存在了。