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如果我通过设置为分离树中的一个分支NullC#即使context仍然是对该共享对象的引用,该分支是否会被正确地进行垃圾收集?

我应该采用什么编码实践来确保它正常工作。

4

2 回答 2

6

假设网络非常大(有数千个节点),并且它们形成树结构。它们之间的这种公共共享引用会导致内存泄漏吗?

不,不应该。

如果我通过将 Parent 设置为 Null 来分离树中的分支。即使上下文仍然是对该共享对象的引用,该分支是否会被 C# 正确地进行垃圾收集?

是的,它应该。唯一可能存在问题的情况是,如果您订阅了寿命较长的对象上的事件,因为事件订阅会创建您的类的引用。仅持有对的引用context不会对允许收集您的课程产生任何影响。

主要问题是一旦没有任何东西可以通过引用“到达”您的对象,这些对象就会被垃圾收集。您的对象仍然可以保存对其他对象的引用,只有反过来才是重要的。

于 2013-08-20T16:06:05.203 回答
3

您的节点引用上下文,因此您的节点可以防止上下文被垃圾收集。不是反过来。

设置Parentnull不会导致该节点被垃圾收集。只要您的节点是从其他类引用的,它就会保留在内存中。
在您的具体代码中,您需要从其父节点的子节点中删除该节点,以便对其进行垃圾收集。

于 2013-08-20T16:06:36.857 回答