问题描述
我们有一个层次结构,其中该结构的每个子节点都引用根节点和父节点,并且还具有一个子节点列表。
类似这样的东西:
public class Node
{
private readonly Node _root;
private readonly Node _parent;
private readonly IList<Node> _items;
public Node(Node root,Node parent)
{
_root = root;
_parent = parent;
_items = new List<Node>();
}
public IList<Node> Items
{
get { return _items; }
}
}
...这:
class Tree
{
// Root node is readonly
readonly Node _root = new Node(null,null);
public void ClearandFill()
{
// Before creating a new tree,delete the existing child items
_root.Items.Clear();
var subNode1 = new Node(_root,_root);
var subNode1_1 = new Node(_root,subNode1);
subNode1.Items.Add(subNode1_1);
var subNode2 = new Node(_root,_root);
var subNode2_1 = new Node(_root,subNode2);
subNode1.Items.Add(subNode2_1);
_root.Items.Add(subNode1);
_root.Items.Add(subNode2);
}
}
我的问题是:如果我们多次调用ClearandFill方法,是否会发生内存泄漏,或者GC会收集所有超出范围的节点?
谢谢。
解决方法
将收集未被任何根引用的任何对象(全局/静态变量,由这些变量的成员指向的任何对象,或者在GC启动时所有线程中的临时堆栈变量)。>
.NET垃圾收集器是mark-and-sweep collector,因此无法访问的对象将不会被标记,因此将被收集。