最初の状況:
C++ オブジェクト配列を作成するときに、初期化リストを通じて割り当てられた場合、一時変数が生成されますが、デストラクターが呼び出されないのはなぜですか?
コードは次のとおりです。
リーリー
出力結果は次のとおりです:
そのうち、Point A[2]={Point(1,2),Point()}; は、2 つの一時変数を介してオブジェクト配列 A を初期化しますが、その結果が Destructors と呼ばれないのはなぜでしょうか。これら 2 つの一時オブジェクトです。
2 番目のケース:
配列の各要素のコンストラクターを明示的に呼び出すと、デストラクターが自動的に呼び出されます:
コードは次のとおりです:
リーリー
実行結果は以下の通りです:
配列要素ごとにコンストラクターの初期化を呼び出した後、一時変数が破棄されていることがわかります。
要約すると、どちらの場合も一時変数ですが、なぜ一方は自動的に破棄され、もう一方は破棄されないのでしょうか? ! !
情報を再度確認し、エラーを修正するために自分で練習しました
理由: オブジェクトの代入は、右側のオブジェクトのメンバーの値を左側のオブジェクトにコピーし、右側のオブジェクトを解放することです
—————— ————
B() が (パラメーターの有無にかかわらず) 呼び出されるたびに、一時オブジェクトが作成されます
ケース 1. (A に保存された) 一時オブジェクトには、その後の値が割り当てられませんが作成されるため、右側のプロセスでオブジェクトを解放する方法はありません。A のオブジェクトは main() が終了するまで存続します
ケース 2. p 配列に値を割り当て、一時オブジェクトを作成し、それを元のオブジェクト (つまり、p の初期化時に自動的に作成される一時オブジェクト) は代入されるだけですよね。 側の一時変数は破棄され、p に保存された一時オブジェクトは削除時に破棄されます
—————— —————
なぜAの右側の一時変数が破壊されないのかは、これを関数で出力してAに保存したオブジェクトへの参照を出力して構築してみると分かります。間違いや理解できない点がございましたら、ご指摘ください。時間内に修正または回答させていただきます
1. スタック空間アプリケーション変数の有効期間は、このスコープが main 関数内にある場合に破棄されます。
2. 削除は言うまでもありません。まず、B[3] もスタック領域ですが、再割り当てするとミッションは終了するため、できるだけ早くリサイクルする必要があります。
リーリー
配列Aは関数のローカル変数で、メモリはスタック領域に確保されます。Point(1,2)とPoint()もローカル変数でスタック領域に確保されます。このとき、コンパイラは通常、メモリのリサイクルと割り当てを減らすために最適化を行います。
リーリー
配列 p のメモリ空間は動的に割り当てられ、ヒープ領域に配置されます。 B(0)、B(7)、B(5、9)はスタック領域上に配置されたローカル変数です。
両者のメモリ割り当て位置が異なるため、コンパイラは最適化できず、正直に破壊することしかできません。