我创建了一个空白的应用程序,其中包含mdi父窗体,从菜单中打开一个空白子窗体。
当子表单的父表单设置为mdi时 - 系统似乎没有释放内存 - 因此泄漏。
如果未设置父表单,则会删除子表单。
有谁知道为什么这个明显的内存泄漏可以解决?
我一直在使用蚂蚁记忆分析器。
鲍勃。
答案 0 :(得分:1)
我认为最常见的内存泄漏源是未正确发布的事件,但是你说你找了它。
如果不查看代码,很难确切知道泄漏的位置。我建议你使用.NET Memory Profiler。我之前使用它,似乎比蚂蚁好。
答案 1 :(得分:1)
这似乎是SP1引入的.net框架2.0中的一个错误,仍然存在于SP2中。
请阅读以下博客文章SciTech软件,.net Memory Profiler的制造商:
http://www.scitech.se/blog/index.php/2008/03/20/minor-memory-leak-introduced-in-net-framework-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进行了测试,并解决了我的问题。
答案 2 :(得分:0)
一种可能性是,如果您订阅了对象上的事件,则不会进行垃圾回收。您必须确保没有任何内容引用该对象。