4

メモリ内にノードの大規模なネットワークがあり、すべてが同じオブジェクトへの参照を持っています。

例として。ネットワーク内の各ノードがこのクラスであると仮定しましょう。

public class Node
{
    /** This is the shared object **/
    public Context context { get; private set; }

    public Node Parent { get; private set; }

    public List<Node> Children { get; private set; }

    public Node(Context pContext, Node pParent, List<Node> pChildren)
    {
        this.context = pContext;
        this.Parent = pParent;
        this.Children = pChildren;
    }
}

プロパティは、ネットワーク内のすべてのcontextノードのコンストラクターに渡されるオブジェクトです。

ネットワークが非常に大きく (数千のノード)、ツリー構造を形成していると仮定します。それらの間のこの共通の共有参照は、メモリリークにつながりますか?

Parentに設定してツリーのブランチをデタッチするとNull。この共有オブジェクトへの参照が残っていC#ても、そのブランチは正しくガベージ コレクションになりますか?context

これが正しく機能するようにするには、どのコーディング手法を採用する必要がありますか。

4

2 に答える 2

6

ネットワークが非常に大きく (数千のノード)、ツリー構造を形成していると仮定します。それらの間のこの共通の共有参照は、メモリリークにつながりますか?

いいえ、そうすべきではありません。

Parent を Null に設定して、ツリー内のブランチをデタッチするとします。コンテキストがこの共有オブジェクトへの参照のままであっても、その分岐は C# によって正しくガベージ コレクションになりますか?

はい、そうすべきです。これが問題になる可能性があるのは、イベント サブスクリプションがクラスへの参照作成するため、存続期間の長いオブジェクトのイベントをサブスクライブしている場合のみです。への参照を保持するだけでcontextは、クラスの収集を許可することに影響はありません。

主な問題は、参照を介してオブジェクトに何も「到達」できなくなるとすぐに、オブジェクトがガベージコレクションされることです。オブジェクトは他のオブジェクトへの参照を引き続き保持できますが、それはその逆です。

于 2013-08-20T16:06:05.203 に答える
3

ノードはコンテキストを参照するため、ノードはコンテキストがガベージ コレクションされるのを防ぎます。その逆ではありません。

に設定Parentするnullと、そのノードがガベージ コレクションされることはありません。ノードが他のクラスから参照されている限り、ノードはメモリに残ります。
具体的なコードでは、ノードをその親の子から削除して、ガベージ コレクションを行う必要があります。

于 2013-08-20T16:06:36.857 に答える