我有一個雙鏈表(隊列),我自己做了。清除雙鏈表
我想知道,清除鏈表,是否足以簡單地刪除頭部和尾部引用?
E.g
public void Clear()
{
Head = null;
Tail = null;
}
我成像多米諾骨牌效應,但我有一個很難測試它。 它將使整個對象至少顯示爲空。所有的數據請求(例如peek,dequeue等)都返回null。 您也可以輕鬆排隊一些新的對象。 純粹的功能似乎是工作。
但是我真的很想知道我是否正確地做了這件事。
我有一個雙鏈表(隊列),我自己做了。清除雙鏈表
我想知道,清除鏈表,是否足以簡單地刪除頭部和尾部引用?
E.g
public void Clear()
{
Head = null;
Tail = null;
}
我成像多米諾骨牌效應,但我有一個很難測試它。 它將使整個對象至少顯示爲空。所有的數據請求(例如peek,dequeue等)都返回null。 您也可以輕鬆排隊一些新的對象。 純粹的功能似乎是工作。
但是我真的很想知道我是否正確地做了這件事。
簡短的回答是肯定的,垃圾收集會清除所有的鏈接列表節點,只要沒有任何外部引用就可以引用它們。
最簡單的測試方法是將終結器添加到輸出某些日誌記錄的鏈接列表節點對象。請注意,您無法確定垃圾收集器何時運行(不通過GC.Collect()強制執行),因此只要您調用Clear()方法,就不會看到調用終結器。
雖然「多米諾骨牌效應」不會發生,引用是否保存到對象並不重要,而不是引用可以追溯到堆棧或靜態對象。因此,如果有多個對象互相引用,但沒有任何引用它們,那麼它們都將被同時垃圾收集。
除非集合中的對象需要處理,集合的責任是做這件事,那麼你的方法可能是最好的方法。
由於對象沒有根(沒有活動引用),垃圾收集可以將其拾取並刪除。
的問題是,這種事情發生在GC的一個通行證,或將作爲OP的多米諾骨牌效應每個「行」所描述的那樣採取單通? – 2009-10-16 10:27:22
感謝您的回答。這是再保證。雖然我會接受FacticiusVir ,因爲他解釋了會發生更徹底的事情:) – CasperT 2009-10-16 10:43:57
它會在一個過程中發生。垃圾收集不會僅刪除沒有實時引用的對象,而是試圖追溯引用回到「根」,基本上就像靜態變量,仍在運行的方法中的局部變量等。如果一個長鏈的對象沒有這樣的根源參考,整個鏈可以收集在同一個通行證。 – 2009-10-16 10:46:45
我拍攝了多米諾骨牌效應
這不是如何GC的作品。
GC首先標記一切都「死」,然後從根對象開始遍歷它們引用的所有對象,標記每個對象爲「活着」。
由於您的列表不再由任何根對象(或其子)引用,它將被標記爲「已死」。
第二遍然後釋放「死」的對象。
我懷疑你可以在終結器中假設列表中任何一方的任何對象都沒有被首先收集,也就是說它將按照GC自己的順序而不是列表的順序。
一個在這裏稍微詳細: - http://msdn.microsoft.com/en-us/magazine/bb985010.aspx
謝謝,它解釋得很好 – CasperT 2009-10-16 10:44:28