2013-02-04 77 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