具有循环引用的实例的垃圾收集

Garbage collection of a instances with circular reference

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

我有一个用树表示的class:

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

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

举个例子。

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

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

所以好像有一个避免节点回收的循环。这是真的?也许我需要将节点和后代中的所有属性设置为 null 并清除后代列表?

非常感谢。

仅当没有可从根位置访问的引用时才收集对象。根位置是 "in scope" 贯穿整个应用程序生命周期的位置,例如静态变量、堆栈等

由于这些对象具有循环引用,如果它们中的任何一个都可以通过有根引用访问(局部变量、静态变量或任何可通过另一系列引用访问的任何东西 link 返回有根引用参考),那么它们都不符合垃圾收集的条件。如果两个对象都不能从有根引用访问,则两个对象都符合垃圾回收条件。