2013-03-23 49 views
10

我使用的是TableLayoutPanel,它是動態填充其他TablelayoutPanelsControls.Clear()清理有多深?

現在我想知道在動態填充的TableLayoutPanel上撥打TableLayoutPanel.Controls.Clear會發生什麼。顯然,所有的子佈局都被刪除了,但他們的孩子呢?它們是否妥善處置,還是需要擔心內存泄漏?

在調用Clear()之前,我應該遞歸地移除子女的子女嗎?

+1

如果沒有其他對象持有對它們的引用,則執行GC'ed。 – Magnus 2013-03-23 11:44:08

+0

對,但我想知道,Sub-Tablelayoutpanel在它的子節點和子節點上有一個對其父節點的引用。我怎樣才能確定GC正確地將它們全部刪除 – Xaser 2013-03-23 11:49:28

回答

16

Clear不處理控件,導致內存泄漏。從鏈接:

調用Clear方法不會從內存中刪除控制句柄。 您必須顯式調用Dispose方法以避免內存泄漏。

由於環內設置食堂的索引,您可以控制集合複製到另一個列表並對其進行ForEach循環或者使用向下For循環。

for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) 
    myTableLayoutPanelControls[i].Dispose(); 

調用Dispose將從內存中移除控件(當GC拿起它時)。這也將處理調用子控件的方法Dispose

一個問題是如果你有一個自定義控件實現了IDisposable或者你正在重寫Dispose方法而不調用base方法。在您的對象的Dispose方法中,您需要確保您已取消訂閱範圍外的任何事件。如果你不這樣做,那個引用會使你的對象保持活着。

1

你的問題有點混亂。 Clear()將刪除引用,並且垃圾收集器將收集對象。

但是,您也使用單詞dispose。被清除的對象將被調用而不是,因爲它們的Dispose方法將被調用。因此,如果您不再使用這些對象,並且想要對它們調用Dispose,則必須自己完成。

+0

好吧,那麼問題是我應該在每個不再使用的對象上調用dispose,或者如果我只是讓gc刪除它,那麼可以。我想不到Dispose方法對於剛剛開始的程序至關重要的事情。同樣,我以前的評論中的問題仍然存在,因爲父母和孩子互相引用,GC是否會收集它們? – Xaser 2013-03-23 12:30:30

+0

對我在發表上述評論 - 研究之前做了我應該做的事情。如果我獲得了正確的MSDN,Dispose方法可以被顯式調用並釋放非託管資源,GC隱式使用finalize方法(如果有效)。然而,正如keyboardP所說,Clear不會清除所有引用,所以我必須明確地調用Dispose。 – Xaser 2013-03-23 12:53:11

+0

@Xaser'Clear'將清除控件內部的所有引用。它不會影響您在代碼中的引用。'Finalize'不保證被調用,這就是爲什麼如果你想確保清理所有非託管資源,你必須調用'Dispose'。 – clearpath 2013-03-25 10:10:22