C++局部变量销毁顺序

gex*_*ide 51 c++ destructor local-variables c++11

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

例如:

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

int main(){
   X x1;
   X x2;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

x1x2毁坏第一主时返回或在C++ 11未定义的顺序?

Jam*_*nze 62

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

  • @DavidGrayson每个类别的不同部分.对于具有线程本地或静态存储的对象,请参见§3.6.3.对于具有自动生命周期的对象,请参阅§6.6(其中_not_可能需要查找它).对于班级成员和基地,见§12.4/ 8.对于临时学生,请参见§12.2. (16认同)
  • Temporaries不严格遵循LIFO排序,因为当参考直接绑定一个时,寿命延长. (8认同)
  • C++标准的哪一部分保证了这个顺序? (5认同)

Axe*_*rja 22

I.关于局部变量

  1. 局部变量在堆栈上分配.

  2. 所述堆栈是基于LIFO(Last-In-First-Out)图案.

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

II.关于你的例子

您的函数main()被称为:

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

main()达到功能范围的结尾时:

  • x2被摧毁并从堆栈中释放出来,
  • x1被破坏并从堆栈中解除分配

III.此外

协议栈是这样的:

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

堆栈方案

  • 这个问题与堆栈的存在或堆栈上分配内容的方向没有任何关系。这与“词法作用域”按照其建立的相反顺序被放弃有关。对象“x1”和“x2”可以按任何顺序在堆栈帧中分配。甚至根本没有;例如它们可以是空结构。 (5认同)
  • 虽然我不同意这个图片,但实现不再是推送/弹出,而且这种情况已经存在很长时间了。相反,它会执行一个“sub %esp, <size>”,并在退出时执行“add %esp, <size>”。因此,换句话说,所有必要的空间都被一次性分配(只有“alloca()”会进一步动态地减少堆栈指针。) (2认同)
  • @AlexisWilke诡异!对2014年以来的答案的评论也差不多,彼此之间相差几秒钟。 (2认同)

Rez*_*imi 7

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

  • 堆栈是后进先出的,而不是先进先出的。(队列是先进先出的。) (2认同)