- ベストアンサー
クラスのメモリ管理について
- クラスのメモリ管理についての問題解決方法を教えてください。
- AとBの関係におけるクラスの生成と消去についての疑問を解消してください。
- クラスのメモリ管理における最適な方法についてお教えください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
anejaさん、こちらこそすみません。文章把握能力が低いもので。。。 >>自分の経験ですが、クラスCに設定されたメンバのインスタンスはクラスCが管理するのが構成としてすっきりすると思います。 >これは、クラスCのトップ(集約される方)の関数で、集約するクラスを明示的にnewする、という認識で合っていますでしょうか。 すみません。クラスCのトップの関数というのは、クラスCのメンバ関数の1つということでしょうか? もちろん。そういう仕様の関数も良いと思います。initializeという関数で初期化処理をしたり、コンストラクタでインスタンスを生成するであったりと考えられます。 ですが、それだけでなく、外部から設定されたインスタンスでもデストラクタでdeleteするとい管理でもよいと思います。(そうでないと今回の仕様は満たされませんよね?) つまり、関数BでクラスCに集約されるクラスDをnewしてそれをクラスCに設定し、そしてクラスDの値を関数Aで使用した後は、不要となる為、クラスDをdeleteする必要がありますが、関数Aの中で直接クラスDをdeleteするのでは無く、クラスCをdeleteするとクラスCのデストラクタで適宜クラスDをdeleteするという構成がいいのかなと思っています。 ただし、何でもかんでもこの構成が良いかというとそうではないので注意して下さい。クラスCをdeleteしても集約しているインスタンスを解放してはいけない構成の方が良い時もあります。(直ぐに例が思いつきませんが。。。) 今回は、クラスCに集約されたクラスは、クラスCと同じ寿命でよいのかなと思ったので最初に回答したような構成をお薦めしました。 ご存知かもしれませんが、このような構成とする場合は、クラスCのデストラクタではNULLチェックをすることをお忘れなく。。。。
その他の回答 (2)
- Pkakedashi
- ベストアンサー率68% (11/16)
anejaさんが行いたい処理は以下のような処理でよいのでしょうか? 1.Aメソッド内でクラスCをnewで生成。 2.Cのポインターを引数に取るBメソッドを呼ぶ。 3.Bメソッド内でクラスCに色々値やインスタンスを設定しメソッドの処理終了。 4.Aメソッド内で引数に渡したクラスCのポインターから必要な値を使用する。 上記のような処理を行いたいというのであれば、Aメソッド内ではCのデストラクタ(delete)を呼ぶのみにし、クラスCがデストラクタ内で自分のメンバを全てdeleteするような構成が良いと思います。 自分の経験ですが、クラスCに設定されたメンバのインスタンスはクラスCが管理するのが構成としてすっきりすると思います。 >(実際には、Bの中だけで使用するクラスもあるので、そういうクラスはできればBで消去したいです) Bの中だけで使用するクラスであれば、クラスCに設定する必要が無いように思うのですが、どうでしょうか?(クラスCのメンバとしては不適切なのでは。。。) この回答は、上記のような処理であると仮定した上で成り立っていますので、違うところがありましたらご指摘下さい。
- Tacosan
- ベストアンサー率23% (3656/15482)
ん~, 「メモリ管理」以前にプログラムの構成そのものがこんがらがっているようにも感じるんだけど.... 例えば C 自体を抽象クラスにして, B が使うのは C の導出クラス (のオブジェクト) とすれば, A は C の詳細を知らなくても消せますね. まあ, B の中だけで使用するクラス (のオブジェクト) が C を経由して A に伝えられるのも変だと思う.
お礼
早速のご回答、どうもありがとうございました。 識者も交えて検討した結果、こういう構成になりました。 すみません、まだオブジェクト指向の知識がほとんど無いのですが、Cを抽象クラスにして、Cの導出クラス(C'とします)をBで生成するということなのでしょうか。 C'の生死に関わらず、AがCのデストラクタを呼ぶと、C'も消滅するのでしょうか? >まあ, B の中だけで使用するクラス (のオブジェクト) が C を経由して A に伝えられるのも変だと思う. これは、おっしゃる通りと思います。 ですので、Aには必要のないいくつかのクラスは、Bの終了処理時に消去しようと思っています。 メモリ管理的には、問題ないのでしょうか。
お礼
ご回答をいただいていたのに、お礼が遅くなり、大変申し訳ありませんでした。とてもわかりやすいご回答をどうもありがとうございました。 説明が拙くて、すみませんでした。前提条件は、Pkakedashi様の書かれたとおりです。 >自分の経験ですが、クラスCに設定されたメンバのインスタンスはクラスCが管理するのが構成としてすっきりすると思います。 これは、クラスCのトップ(集約される方)の関数で、集約するクラスを明示的にnewする、という認識で合っていますでしょうか。 >Bの中だけで使用するクラスであれば、クラスCに設定する必要が無いように思うのですが、どうでしょうか? そうですね、別クラスにできないか、検討してみます。どうもありがとうごました。