我分析了一个VB.NET项目,发现有一些对象(子MDI窗体)已被处理,但未被GC移除。
更好的是
MemoryProfiler分析结果如下:
"此实例已被处理,但仍由EventHandler间接引用。这通常表示EventHandler未被正确地移除,是内存泄漏的常见原因。以下实例直接由EventHandler引用。请调查它们以获取更多关于此问题的信息..."
现在,我试图弄清楚这意味着什么以及如何修复它。
我有一个MDI表单和一个子表单。经过打开/关闭操作后,子表单没有被GC收集,显然是因为仍然(间接?)被MDIForm EventHandlerList
引用...
这可能是什么问题,我该如何解决?
我尝试了此线程中建议的修复方法,因为在PropertyStore
中存在MDI引用问题,现在已经消除了,但出现了MDI EventHandlerList
引用子表单的问题...
经过一些代码分析,我观察到了一些
AddHandler newMenu.Click, AddressOf ClickMenu
没有使用 RemoveHandler newMenu.Click, AddressOf ClickMenu
前缀。这可能是主要原因吗?
另外,关于 Handles
,请问呢?
Private Sub ClickMenu(sender as Object, e as EventArgs) Handles newMenu.Click
更好的是
RemoveHandler newMenu.Click, AddressOf ClickMenu
AddHandler newMenu.Click, AddressOf ClickMenu
从内存分配的角度来看?