2011-10-09 17 views
0

我代替:試圖替換Controls.Clear()以避免內存泄漏不起作用 - 爲什麼?

panel.Controls.Clear(); 

有:

Clear(panel); 

其中:

public static void Clear(Control ctrl) 
{ 
    while (ctrl.Controls.Count > 0) ctrl.Controls[0].Dispose(); 
} 

而且我得到以下錯誤:在Application.Run(new Form1()); System.ObjectDisposedException是未處理 無法訪問已釋放目的。 對象名稱:'標籤'。

任何想法爲什麼這可能是?

謝謝。

編輯: 見How to Clear() controls without causing a memory leak

編輯:對不起,我可能處置的,我只是想從其父刪除的東西。我會檢查的。感謝您的答案。

+0

爲什麼你認爲這種方法會有所幫助? –

+0

@JonasElfström請參閱編輯。 – ispiro

回答

0

我可能正在處理一些Control s我使用稍後的代碼。

0

您需要刪除您配置的控制,但有可能是一個更好的方法:

public static void Clear(Control ctrl) 
{ 
    foreach(Control c in ctrl.Controls) c.Dispose(); 
    ctrl.Controls.Clear(); 
} 
+0

'''''''查看編輯。 – ispiro

+3

非常糟糕的想法。這隻能配置其他所有控件。試試看,在表單上放4個按鈕,並通過foreach循環單步執行,以查看調用Dispose()的頻率。 –

+0

@HansPassant出於興趣,爲什麼它只處理所有其他控件? –

3

Dispose()什麼做內存在正常情況下。它不釋放內存,它不會從集合中移除對象,也不會調用垃圾回收器。反而,.Dispose()目的是清理非內存資源:數據庫連接器,插座,設備句柄,GDI處理等

這可能可以幫助您解決內存問題的唯一方法是,如果你」重新使用每個依賴於非託管(非.Net)dll中的代碼的自定義控件。

+0

它還釋放正常控件上的gdi +手柄。這就是爲什麼你需要在控件上調用Dispose。 – Femaref

+0

'''''''參見編輯。 – ispiro

+1

那是一個術語問題。你可能會泄漏_handles_,但你不會泄漏內存。 –