• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++のnewで確保した領域について)

C++のnewで確保した領域について

このQ&Aのポイント
  • C++のnew演算子を使ってインスタンスを生成すると、確保される領域はスタックではなくヒープ領域です。不要になった場合はdeleteを使って領域を解放する必要があります。
  • 質問1:クラスAをインスタンス生成した場合、コンストラクタで確保したヒープ領域はプログラム終了時まで解放されないのでしょうか?
  • 質問2:オート変数の*mycarはコンストラクタからreturnした時点で解放されてしまうため、デストラクタでヒープ領域をdeleteできないのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • _kappe_
  • ベストアンサー率68% (1578/2300)
回答No.1

回答1:Carオブジェクトに対してdeleteを呼ぶコードがどこかにあってそれが実行されれば、プログラム終了前にヒープから消えます。 回答2:mycarという変数自体の領域は解放されますが、mycarが指しているオブジェクトはヒープ内に残ります。もしクラスAはCarオブジェクトへのポインタを保持せず、addGarage()によってGarageがCarオブジェクトへのポインタを保持する設計であれば、CarオブジェクトをdeleteすべきなのはGarageを削除するとき(またはGarageは使い続けるがそのCarオブジェクトは不要になった時)です。 回答3:はい。質問の例の場合はGarageがポインタを保持するのだろうと思います。クラスAで保持するようにしてもいいですが、いつ誰がCarオブジェクトをdeleteすべきなのかを設計時に明確に決めておかないと、delete済のオブジェクトに誤ってアクセスしようとする問題が生じます。 回答4:やってもいいですけれど、あまりやらないと思います。 ・その関数の中でだけそのオブジェクトを使う→ヒープ上にオブジェクトを確保したい理由が特になければnewを使わずにスタック上に確保する ・その関数から抜けた後もそのオブジェクトを使う→そのオブジェクトへのポインタをオート変数以外のどこかで保持する必要がある(その前段階で一時的にオート変数に代入することはあり得る)

noname#255871
質問者

お礼

ご回答ありがとうございました! YES/NOだけでなく詳しく教えて頂きとてもよく分かりました。

関連するQ&A

専門家に質問してみよう