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