ContextMenuStrip导致内存泄漏

时间:2010-05-08 00:28:32

标签: c# .net winforms memory-leaks

我正在创建许多自定义控件并将它们添加到FlowLayoutPanel。还有一个在设计时创建并填充的ContextMenuStrip。

每次将控件添加到面板时,都会将其ContextMenuStrip属性分配给此菜单,以便所有控件“共享”相同的菜单。但我注意到当从面板中删除控件并将其丢弃时,任务管理器中使用的内存不会丢失。每次创建控件并将其添加到布局面板时,它都会上升大约50kB。

我下载了.NET Memory Profiler的试用版,它显示在控件处理后有一些菜单条的引用。我更改了代码,在处理控件之前将ContextMenuStrip属性显式设置为null,是的,内存现在已经释放了。为什么是这样? GC不应该清理这种类型的东西吗?

2 个答案:

答案 0 :(得分:6)

如果您查看Control的ContexmenuStrip属性,您将看到setter将控件订阅到MenuStrip的Disposed事件,从MenuStrip到Control创建一个反向引用。

这意味着它是可通过事件的经典案例,您已经找到了解决方案:将ContexmenuStrip属性设置为null。

答案 1 :(得分:0)

您应该始终处置ContextMenuStrip,以防每次动态创建它。这是因为每次都是创建的本机句柄,但不会被销毁。这意味着如果您创建了contextmenu并显示它,那么关闭它并再次显示它将会用完句柄。