是否存在一個定義的順序,其中局部變量在C++(11)中被釋放? 更簡潔:在同一個作用域中,兩個局部變量的析構函數的副作用將變爲可見?C++局部變量銷燬順序
例如爲:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
是x1
或x2
毀壞第一主時返回或順序未定義在C++ 11?
是否存在一個定義的順序,其中局部變量在C++(11)中被釋放? 更簡潔:在同一個作用域中,兩個局部變量的析構函數的副作用將變爲可見?C++局部變量銷燬順序
例如爲:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
是x1
或x2
毀壞第一主時返回或順序未定義在C++ 11?
在每個類別的存儲類(動態分配的對象除外)中,對象按照與構造相反的順序被銷燬。
它們以反向分配順序銷燬,請參閱this SO question。在這種情況下,這意味着x2
將在x1
之前銷燬。
這是一個Stack Data Structure
行爲,所以局部變量存儲在Stack中作爲LIFO (Last-In-First-Out)
數據結構,可以想象在LIFO數據結構中,最後一個添加到結構中的變量必須是第一個被刪除的變量。變量是從reverse order
中堆棧的removed
到它們添加的順序。
堆棧是LIFO,而不是FIFO。 (隊列是FIFO。) – Spire
C++標準的哪些部分保證了這個順序? –
@DavidGrayson每個類別的不同部分。對於帶有 線程本地或靜態存儲的對象,請參閱§3.6.3。對於具有自動 生命週期的對象,請參閱第6.6節(它不適用於人們可能期望尋找 的地方)。對於班級成員和基地,請參閱§12.4/ 8。臨時參見 §12.2。 –
暫時不嚴格遵循LIFO排序,由於參考直接綁定一個時的延長壽命。 –