C++(11)でローカル変数が割り当て解除される定義済みの順序はありますか?もっと簡潔に:同じスコープ内の2つのローカル変数のデストラクタの副作用がどの順序で見えるようになりますか?
例えば。:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
x1
またはx2
mainが戻るか、C++ 11で順序が未定義の場合、最初に破棄されますか?
ストレージクラスの各カテゴリ(動的に割り当てられたオブジェクトを除く)内では、オブジェクトは構築の逆の順序で破棄されます。
I。ローカル変数について
ローカル変数はStackに割り当てられます。
Stackは、LIFO
(_Last-In-First-Out
_)パターンに基づいています。
したがって、変数は、割り当てと構築の逆の順序で破棄および割り当て解除されます。
II。あなたの例について
関数main()
が呼び出されます:
x1
_はStackで割り当てられ、構築されます。x2
_はStackに割り当てられ、構築されますそしてmain()
関数スコープの終わりに達したとき:
x2
_は破棄され、Stackから割り当て解除されます。x1
_は破棄され、Stackから割り当て解除されますIII。さらに
Stackは次のようになります。
(Stackの動作はスキームでより理解しやすいようです)
これは_Stack Data Structure
_の振る舞いなので、ローカル変数はStackにLIFO (Last-In-First-Out)
データ構造として保存され、LIFOデータ構造では最後に追加された変数変数は、_reverse order
_のスタックからその追加の順序までのremoved
です。
これらは逆の割り当て順序で破棄されます。 this SO question を参照してください。この場合、これはx2
がx1
の前に破棄されることを意味します。 。
それらは、逆の順序で破壊されます。