ContextMenuStrip导致内存泄漏

Dav*_*ave 9 .net c# memory-leaks winforms

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

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

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

Hen*_*man 6

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

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