2011-10-09 15 views
2

閱讀Control.Clear();導致內存泄漏(在MSDN驗證)後,我在想,如果:如何清除()控制,而不會造成內存泄露

while (Controls.Count > 0) Controls[0].Dispose(); 

就足夠了,還是我遞歸遍歷通過控件內的所有控件?

此外,是否有任何理由在此之後做Control.Clear();? (正如我看到有人在某處說的)?

謝謝。

+3

你的代碼會無限循環。 – svick

+0

@svick每個Dispose()之後的編號 - 控件[1]成爲'Controls [0]'。 – ispiro

+1

Technichally否,因爲dispose不會刪除實際的對象,只是釋放其資源,正如我在我的回答中所說的,必須在調用dispose後顯式刪除引用。 –

回答

5

張貼的片段是正確的。不需要Clear(),Control.Dispose()方法已經從Controls集合中刪除控件。這是它工作的原因。

循環的那麼令人震驚的版本是:

for (int ix = Controls.Count-1; ix >= 0; --ix) Controls[ix].Dispose(); 

無需通過控制的兒童進行迭代和處理他們,已經自動發生。

+0

感謝您在198k支持下的明確答案。 – ispiro

+0

呵呵,低估。有人沒有在198k的支持看起來很多股票:) –

+0

這可能來自http://stackoverflow.com/questions/7706528/trying-to-replace-controls-clear-to-avoid-memory-leak-沒有工作 - 爲什麼 – ispiro