带循环引用的实例的垃圾收集

时间:2015-01-09 17:54:20

标签: c# garbage-collection

我知道当一个对象没有引用时,垃圾收集器会释放内存。但我怀疑。

我有一个由树代表的类:

class MyNode
{
    string Name;
    List<MyNode> Descendants;
    MyNode Parent;
}

当我创建一个具有后代的节点时,我有对该节点的引用,并且子也引用了Parent属性中的节点。此外,该节点还引用了后代列表中的后代。

这是一个例子。

Node myNode = new Node();
Node myDescendant = new Node();
myNode.Descendants.Add(myDescendant);
myDescendant.Parent = myNode;

我可以删除对myNode的引用,将其设置为null。但是,仍然引用该对象,因为myDescendantParent属性中引用了它。不会重新收集myDescendant对象,因为在节点对象的后代列表中引用了该对象。

所以似乎有一个循环可以避免节点重新收集。这是真的?也许我需要在节点和后代中设置null所有属性并清除后代列表?

非常感谢。

1 个答案:

答案 0 :(得分:1)

仅在没有可从根位置访问的引用时收集对象。根植的位置是&#34;在范围内的位置&#34;整个应用程序的生命周期,如静态变量,堆栈等。

由于这些对象具有循环引用,如果它们中的任何一个都可以通过有根引用(局部变量,静态变量或通过链接回根引用的另一系列引用可访问的任何内容)访问,那么它们都不是有资格进行垃圾收集。如果两个对象都不能从rooted引用访问,那么这两个对象都有资格进行垃圾回收。