我有一个自己编写的双向链表(队列)。
我想知道,要清空该链表,是否仅需删除头部和尾部引用即可?
例如:
public void Clear()
{
Head = null;
Tail = null;
}
我想象了一个多米诺骨牌效应,但我很难测试它。
它至少会使整个对象看起来是空的。所有数据请求(如peek、dequeue等)都返回null。
您还可以轻松地将一些新对象加入队列。
纯函数似乎是有效的。
但我真的很想知道我是否以正确的方式做到了这一点。
我有一个自己编写的双向链表(队列)。
我想知道,要清空该链表,是否仅需删除头部和尾部引用即可?
例如:
public void Clear()
{
Head = null;
Tail = null;
}
我想象了一个多米诺骨牌效应,但我很难测试它。
它至少会使整个对象看起来是空的。所有数据请求(如peek、dequeue等)都返回null。
您还可以轻松地将一些新对象加入队列。
纯函数似乎是有效的。
但我真的很想知道我是否以正确的方式做到了这一点。
除非集合中的对象需要被处理,并且这是集合的责任,否则您的方法可能是最好的方式。
由于对象没有根(没有实时引用),垃圾收集器可以将其回收并删除它。
我正在想象多米诺骨牌效应
这不是GC的工作方式。
GC首先标记所有“死亡”的内容,然后从根对象开始遍历所有被它们引用的对象,将每个对象标记为“活动的”。
由于您的列表不再被任何根对象(或其子对象)引用,因此它将被标记为“死亡的”。
第二轮清理将释放“死亡”对象。
我不相信您可以在finalizer中假设列表两侧的任何对象都没有被先收集,即它将按照GC自己的顺序而不是列表的顺序进行处理。
这里提供更多详细信息:http://msdn.microsoft.com/en-us/magazine/bb985010.aspx