web-dev-qa-db-ja.com

C ++ローカル変数の破棄順序

C++(11)でローカル変数が割り当て解除される定義済みの順序はありますか?もっと簡潔に:同じスコープ内の2つのローカル変数のデストラクタの副作用がどの順序で見えるようになりますか?

例えば。:

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

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

x1またはx2 mainが戻るか、C++ 11で順序が未定義の場合、最初に破棄されますか?

49
gexicide

ストレージクラスの各カテゴリ(動的に割り当てられたオブジェクトを除く)内では、オブジェクトは構築の逆の順序で破棄されます。

60
James Kanze

I。ローカル変数について

  1. ローカル変数はStackに割り当てられます。

  2. Stackは、LIFO(_Last-In-First-Out_)パターンに基づいています。

  3. したがって、変数は、割り当てと構築の逆の順序で破棄および割り当て解除されます。

II。あなたの例について

関数main()が呼び出されます:

  • _x1_はStackで割り当てられ、構築されます。
  • _x2_はStackに割り当てられ、構築されます

そしてmain()関数スコープの終わりに達したとき:

  • _x2_は破棄され、Stackから割り当て解除されます。
  • _x1_は破棄され、Stackから割り当て解除されます

III。さらに

Stackは次のようになります。

Stackの動作はスキームでより理解しやすいようです)

Stack scheme

21
Axel Borja

これは_Stack Data Structure_の振る舞いなので、ローカル変数はStackにLIFO (Last-In-First-Out)データ構造として保存され、LIFOデータ構造では最後に追加された変数変数は、_reverse order_のスタックからその追加の順序までのremovedです。

6
Reza Ebrahimi

これらは逆の割り当て順序で破棄されます。 this SO question を参照してください。この場合、これはx2x1の前に破棄されることを意味します。 。

4
PrisonMonkeys

それらは、逆の順序で破壊されます。

2
UmNyobe