【发布时间】:2011-02-24 11:43:29
【问题描述】:
几周前,我遇到了与 ContextMenuStrip 相关的内存泄漏问题。那个问题是固定的。 See that question here
现在我在使用 ToolStrip 控件时遇到了类似的问题。 与上一个问题一样,我正在创建大量用户控件并将它们添加到 FlowLayoutPanel。每个控件在其构造函数中为自己创建一个 ToolStrip。当从 FlowLayoutPanel 中删除一个控件(对该控件的唯一引用)时,似乎没有释放 ToolStrip 的内存。
但是,当我注释掉创建 ToolStrip 的代码时,不会发生内存泄漏。
这是否与上一个问题相同 - 我需要将 ToolStrip 设置为 null?我不明白这是怎么回事,因为这次控件正在创建条带本身,并且所有按钮事件等都在其中处理。那么当不再引用控件时,不应该对所有内容进行 GC 处理吗?
编辑: 至于 cmets,我不明白的是,我最初是用面板和一些标签“制作”我自己的工具条。标签被用作按钮。这种方式没有发生内存泄漏。
我唯一改变的是使用适当的 ToolStrip 和适当的按钮代替面板,但所有事件处理程序的连接方式相同。那么为什么它现在会泄漏内存呢?
编辑2: 我正要发布我的代码,但重新阅读了 Dave 链接到的问题。原来是 ToolStrip 的 UserPreferenceChangedEvent 问题。如果我将 ToolStrip.Visible 属性设置为 false,则不会发生内存泄漏!
现在,我可以在 Dispose 方法中执行此操作吗?如果有怎么办?我尝试复制一些代码,但收到编译警告:“MyToolStrip.Dispose()”隐藏了继承的成员“System.ComponentModel.Component.Dispose()” 我只是不明白 IDisposable 接口。
【问题讨论】:
-
95% 的时间,您在注册事件处理程序,而不是在清除控件集合时取消注册它们。那将是我看的第一个地方。
-
不确定这个问题是否有帮助,但我觉得它很有趣:stackoverflow.com/questions/620733/memory-leak-in-c
标签: c# memory-leaks