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

每次将控件添加到面板时,都会为其菜单分配其ContextMenuStrip属性,以便所有控件“共享”同一菜单。但是我注意到,当从面板上卸下控件并进行处理时,任务管理器中使用的内存不会丢失。每次创建控件并将其添加到布局面板时,它就会增加大约50kB。

我下载了.NET Memory Profiler的试用版,结果显示在放置控件后,菜单条的引用仍然存在。我更改了代码,以在处置控件之前将ContextMenuStrip属性显式设置为null,是的,现在释放了内存。为什么是这样? GC是否不应该清理此类事件?

最佳答案

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

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

关于c# - 使用ContextMenuStrip的内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2792427/

10-11 03:29