2013-02-04 53 views
38

是否存在一个定义的顺序,其中局部变量在C++(11)中被释放? 更简洁:在同一个作用域中,两个局部变量的析构函数的副作用将变为可见?C++局部变量销毁顺序

例如为:

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

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

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

回答

47

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

+3

C++标准的哪些部分保证了这个顺序? –

+11

@DavidGrayson每个类别的不同部分。对于带有 线程本地或静态存储的对象,请参阅§3.6.3。对于具有自动 生命周期的对象,请参阅第6.6节(它不适用于人们可能期望寻找 的地方)。对于班级成员和基地,请参阅§12.4/ 8。临时参见 §12.2。 –

+3

暂时不严格遵循LIFO排序,由于参考直接绑定一个时的延长寿命。 –

2

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

+0

其实,他们的建筑顺序相反。 –

+0

是的,这是我的。 – UmNyobe

5

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

+1

堆栈是LIFO,而不是FIFO。 (队列是FIFO。) – Spire

16

一,关于局部变量

  1. 局部变量分配在堆栈

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

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

二,关于你的榜样

你的函数main()叫做:

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

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

  • x2被破坏并从堆栈
  • x1释放被破坏并从堆栈

III释放。此外

堆栈这个样子的:

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

Stack scheme