ローカル変数がC++(11)で割り当て解除される定義された順序はありますか?より簡潔に言うと、同じスコープ内の2つのローカル変数のデストラクタの副作用はどの順序で表示されますか?
例えば:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
mainが戻ったときに最初に破棄されますx1
かx2
、それともC ++ 11で順序が定義されていませんか?
ローカル変数がC++(11)で割り当て解除される定義された順序はありますか?より簡潔に言うと、同じスコープ内の2つのローカル変数のデストラクタの副作用はどの順序で表示されますか?
例えば:
struct X{
~X(){/*do something*/}
}
int main(){
X x1;
X x2;
return 0;
}
mainが戻ったときに最初に破棄されますx1
かx2
、それともC ++ 11で順序が定義されていませんか?
ストレージクラスの各カテゴリ(動的に割り当てられたオブジェクトを除く)内では、オブジェクトは構築の逆の順序で破棄されます。
I.ローカル変数について
ローカル変数はスタックに割り当てられます。
スタックLIFO
は(Last-In-First-Out
)パターンに基づいています。
したがって、変数は破棄され、割り当てと構築の逆の順序で割り当てが解除されます。
II。あなたの例について
あなたの関数main()
は次のように呼ばれます:
x1
スタック上に割り当てられて構築され、x2
スタック上に割り当てられ、構築されますmain()
関数スコープの終わりに達したとき:
x2
スタックから破棄され、割り当てが解除されます。x1
スタックから破棄され、割り当てが解除されますIII。さらに
スタックは次のようになります。
(スタックの動作は、スキームを使用した方が理解しやすいようです)
これはStack Data Structure
動作であるため、ローカル変数はデータ構造としてStackに格納されLIFO (Last-In-First-Out)
ます。LIFOデータ構造では、構造に追加された最後の変数が最初に削除される変数である必要があると想像できます。変数はremoved
、スタックからreverse order
追加順になります。
それらは逆の割り当て順序で破棄されます。このSOの質問を参照してください。この場合、これはx2
前に破棄されることを意味しx1
ます。
それらは、それらの構築の逆の順序に従って破壊されます。
https://isocpp.org/wiki/faq/dtors#order-dtors-for-locals
isocpp.orgには、このトピックに関するFAQがあり、逆の順序で実行されると書かれています。でも、このオリジナルの質問をした時は公式サイトは存在しなかったと思います。