71

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

例えば:

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

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

mainが戻ったときに最初に破棄されますx1x2、それともC ++ 11で順序が定義されていませんか?

4

6 に答える 6

85

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

于 2013-02-04T14:00:33.443 に答える
30

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

  1. ローカル変数はスタックに割り当てられます。

  2. スタックLIFOは(Last-In-First-Out)パターンに基づいています。

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

II。あなたの例について

あなたの関数main()は次のように呼ばれます:

  • x1スタック上に割り当てられて構築され、
  • x2スタック上に割り当てられ、構築されます

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

  • x2スタックから破棄され、割り当てが解除されます。
  • x1スタックから破棄され、割り当てが解除されます

III。さらに

スタックは次のようになります。

スタックの動作は、スキームを使用した方が理解しやすいようです)

スタックスキーム

于 2015-09-14T12:55:30.753 に答える
7

これはStack Data Structure動作であるため、ローカル変数はデータ構造としてStackに格納されLIFO (Last-In-First-Out)ます。LIFOデータ構造では、構造に追加された最後の変数が最初に削除される変数である必要があると想像できます。変数はremoved、スタックからreverse order追加順になります。

于 2013-02-04T14:37:24.180 に答える
4

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

于 2013-02-04T14:02:40.970 に答える
2

それらは、それらの構築の逆の順序に従って破壊されます。

于 2013-02-04T13:59:53.777 に答える
2

https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals

isocpp.orgには、このトピックに関するFAQがあり、逆の順序で実行されると書かれています。でも、このオリジナルの質問をした時は公式サイトは存在しなかったと思います。

于 2020-03-16T19:02:17.527 に答える