これは非常に基本的な質問です。C++ と Java を使用して定式化しますが、実際には言語に依存しません。C++ のよく知られた問題を考えてみましょう。
struct Obj
{
boost::shared_ptr<Obj> m_field;
};
{
boost::shared_ptr<Obj> obj1(new Obj);
boost::shared_ptr<Obj> obj2(new Obj);
obj1->m_field = obj2;
obj2->m_field = obj1;
}
これはメモリリークであり、誰もが知っています:)。解決策もよく知られています。弱いポインターを使用して、「参照カウントのインターロック」を解除する必要があります。この問題は原理的に自動的に解決できないことも知られています。それを解決するのは、プログラマの責任です。
しかし、良い点があります。プログラマーは refcount 値を完全に制御できます。デバッガーでプログラムを一時停止し、obj1、obj2 の refcount を調べて、問題があることを理解できます。また、オブジェクトのデストラクタにブレークポイントを設定して、破壊の瞬間を観察する (またはオブジェクトが破壊されていないことを確認する) こともできます。
私の質問は、Java、C#、ActionScript、およびその他の「ガベージ コレクション」言語に関するものです。私は何かが欠けているかもしれませんが、私の意見では
- オブジェクトの参照カウントを調べさせない
- オブジェクトが破棄されたときに通知しない (オブジェクトが GC に公開されたとき)
これらの言語は、プログラマーがメモリをリークすることを許可していないため、これらの言語は優れているとよく耳にします。私が理解している限りでは、それらはメモリ管理の問題を隠し、解決を困難にするだけです。
最後に、質問自体:
ジャワ:
public class Obj
{
public Obj m_field;
}
{
Obj obj1 = new Obj();
Obj obj2 = new Obj();
obj1.m_field = obj2;
obj2.m_field = obj1;
}
- メモリリークですか?
- はいの場合: どうすれば検出して修正できますか?
- いいえの場合:なぜですか?