2013-10-23 32 views
2

在一些調試通過新的可能的內存泄漏,我碰到一個代碼來了,如同調試我發現,這個名單總是抱着對象,而他們從內部取出時以下C# - 在屬性

public IEnumerable<ISomething> TheSomeThingList 
    { 
     get 
     { 
      var somethings = new List<ISomething>(); 

      // Fill the list by doing some iteration over internal dictionary of dictionaries 
      return somethings.AsEnumerable(); 
     } 
    } 

現在,字典。由於此列表保留對已移除對象的引用,因此此類代碼可能會導致內存泄漏?

此類代碼是否會導致內存泄漏?

如果是,該問題的解決方案是什麼?請注意,我無法更改屬性的界面。

我的第一反應是創建一個後臺字段Collection並在內部刪除發生時清除它。

一些細節 -

  1. 誰具有上述屬性的類是應用級的單
  2. 其填充到列表中的對象都應該(通過團結而不是通過單例模式實現)在某些操作(例如關閉文檔)後進行清理。抓住這些物體不會讓它們被垃圾收集。
+3

只要您持有從此返回的'IEnumerable'的引用,它就不會被垃圾收集,並且其中包含的對象也不會被GCed。但我不會稱之爲「泄漏」。 – crashmstr

+3

列表的生命週期取決於調用者在返回的'IEnumerable'持有多久。很明顯,預計它會被枚舉,然後被丟棄。這不會「泄漏」任何東西。 –

回答

7

這不是內存泄漏,因爲仍然存在對這些對象的「活躍」引用。它們在該列表中,並且該列表正在從該方法返回。如果這些對象不是保持活動狀態,則此方法的調用者將訪問被刪除的對象,而這些對象不應該發生。無論何時該列表不能再通過根引用訪問,並且如果該列表中的任何項目都無法在別處訪問,則可以對元素和列表進行垃圾收集。

沒有泄漏。

+0

+1對我來說太快了...... – Steve

3

這不是內存泄漏,因爲有一個IEnumerable仍然有一個對象的引用。您不希望這些對象被刪除,因爲使用IEnumerable<ISomething>的用戶可能會對有不再有效的對象感到有些驚訝。

無論對IEnumerable持有什麼,都會保持對象生存期處於活動狀態,您需要找到一種方法來清除已從屬性返回的內部狀態和IEnumerable