我有自己制作的双链表(队列)。
我想知道,要清除链表,是否足以简单地删除头部和尾部的引用?
E.g
public void Clear()
{
Head = null;
Tail = null;
}
我正在拍摄多米诺骨牌效应,但我很难测试它。 它将使整个对象至少显示为空。所有数据请求(例如peek,dequeue等)都返回null。 您还可以轻松地将一些新对象排入队列。 纯粹的功能似乎正在发挥作用。
但我真的很想知道我是否采取了正确的方式。
答案 0 :(得分:7)
简短的回答是肯定的,垃圾收集将清除所有链表节点,只要外部没有任何内容可以引用它们。
最简单的测试方法是将终结器添加到输出一些日志记录的链表节点对象中。请注意,您无法确定垃圾收集器何时运行(不通过GC.Collect()强制它),因此只要您调用Clear()方法就不会看到调用终结器。
但是,“多米诺骨牌效应”不会发生;引用是否保存到对象并不重要,而不是引用可以追溯到堆栈或静态对象。因此,如果几个对象相互引用,但没有任何引用它们,那么它们将同时被垃圾收集。答案 1 :(得分:4)
除非需要处理集合中的对象,并且集合负责这样做,否则您的方法可能是最好的方法。
由于对象没有根(没有实时引用),垃圾收集可以将其删除并删除它。
答案 2 :(得分:2)
我正在拍摄多米诺骨牌效应
这不是GC的工作方式。
GC首先将所有内容标记为“死”,然后从根对象开始遍历它们引用的所有对象,将每个对象标记为“活着”。
由于您的列表不再被任何根对象(或其子代)引用,因此它将被标记为“死”。
第二遍然后释放“死”对象。
我怀疑你可以在终结者中假设列表中任何一方的任何对象都没有先被收集,即它将按照GC自己的顺序而不是列表的顺序。
这里有更多细节: - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx