1

我创建了一个空白应用程序,其 mdi 父表单从菜单中打开了一个空白子表单。

当子窗体的父窗体设置为 mdi 时 - 系统似乎没有释放内存 - 因此出现泄漏。

未设置父窗体时,将删除子窗体。

有谁知道为什么可以解决这个明显的内存泄漏?

我一直在使用蚂蚁内存分析器。

鲍勃。

4

3 回答 3

1

我认为内存泄漏的最常见来源是未正确释放的事件,但您说您正在寻找它。

如果不查看代码,很难确切地知道泄漏在哪里。我建议您使用.NET Memory Profiler。我以前用过,感觉比蚂蚁强。

于 2009-08-06T17:26:28.697 回答
1

这似乎是随 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 对此进行了测试,它解决了我的问题。

于 2010-05-04T14:34:08.520 回答
0

一种可能性是,如果您订阅了对象上的事件,则不会对它进行垃圾收集。您必须确保没有任何内容引用该对象。

于 2009-08-06T10:27:10.193 回答