幾個星期前,我遇到了與ContextMenuStrip有關的內存泄漏問題。這個問題已經解決了。 See that question here內存泄漏,再次!
現在我遇到了ToolStrip控件的類似問題。 和前面的問題一樣,我創建了大量的UserControl並將它們添加到FlowLayoutPanel中。每個控件都在其構造函數中爲其自身創建一個ToolStrip。當從FlowLayoutPanel(對控件的唯一引用)中刪除控件時,似乎ToolStrip的內存未被釋放。
但是,當我註釋掉創建ToolStrip的代碼時,內存泄漏不會發生。
這和前面的問題一樣 - 我需要將ToolStrip設置爲null?我不明白這是怎麼回事,因爲這時控制器正在創建條帶本身,並且所有的按鈕事件都在其中進行處理。所以當控件不再被引用時,不應該把所有東西都GC'd?
編輯: 至於評論,我不明白的事情是我原來是「製造」自己的工具條了一個面板和一些標籤。標籤被用作按鈕。這種方式沒有發生內存泄漏。
我唯一改變的是使用合適的ToolStrip和適當的按鈕來代替面板,但所有事件處理程序都以相同的方式進行連線。那爲什麼它現在正在泄漏記憶?
編輯2: 我剛剛發佈我的代碼,但重讀了戴夫鏈接到的問題。事實證明,這是ToolStrip的UserPreferenceChangedEvent問題。如果我將ToolStrip.Visible屬性設置爲false,則內存泄漏不會發生!
現在,我可以在Dispose方法中執行此操作嗎?如果是這樣如何?我試圖複製一些代碼,但我得到了一個編譯警告:「MyToolStrip.Dispose()'隱藏繼承成員'System.ComponentModel.Component.Dispose()」 我只是不理解IDisposable接口。
95%的時間,你註冊事件處理程序,而不是清除你的控件集合時取消註冊它們。那將是我看的第一個地方。 – Juliet 2010-05-27 03:48:30
不知道這個問題是否有幫助,但我發現它很有趣:http://stackoverflow.com/questions/620733/memory-leak-in-c – Dave 2010-05-27 03:53:19