我创建了一个空白应用程序,其 mdi 父表单从菜单中打开了一个空白子表单。
当子窗体的父窗体设置为 mdi 时 - 系统似乎没有释放内存 - 因此出现泄漏。
未设置父窗体时,将删除子窗体。
有谁知道为什么可以解决这个明显的内存泄漏?
我一直在使用蚂蚁内存分析器。
鲍勃。
我创建了一个空白应用程序,其 mdi 父表单从菜单中打开了一个空白子表单。
当子窗体的父窗体设置为 mdi 时 - 系统似乎没有释放内存 - 因此出现泄漏。
未设置父窗体时,将删除子窗体。
有谁知道为什么可以解决这个明显的内存泄漏?
我一直在使用蚂蚁内存分析器。
鲍勃。
我认为内存泄漏的最常见来源是未正确释放的事件,但您说您正在寻找它。
如果不查看代码,很难确切地知道泄漏在哪里。我建议您使用.NET Memory Profiler。我以前用过,感觉比蚂蚁强。
这似乎是随 SP1 引入的 .net framework 2.0 中的一个错误,并且在 SP2 中仍然存在。
只需阅读以下博客文章 SciTech 软件,.net Memory Profiler 的制造商:
http ://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-框架-20-sp1/
要解决此问题,请将以下代码添加到您的 MDI 父窗体:
protected override void OnMdiChildActivate(EventArgs e)
{
// Code from http://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-framework-20-sp1/
base.OnMdiChildActivate(e);
try
{
typeof(Form).InvokeMember("FormerlyActiveMdiChild",
BindingFlags.Instance | BindingFlags.SetProperty |
BindingFlags.NonPublic, null,
this, new object[] { null });
}
catch (Exception)
{
// Something went wrong. Maybe we don't have enough
// permissions to perform this or the
// "FormerlyActiveMdiChild" property no longer
// exists.
}
}
我用 ANTS Memory Profiler 对此进行了测试,它解决了我的问题。
一种可能性是,如果您订阅了对象上的事件,则不会对它进行垃圾收集。您必须确保没有任何内容引用该对象。