Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 子窗体为空的mdi上内存泄漏_C#_.net_Memory Leaks_Mdi - Fatal编程技术网

C# 子窗体为空的mdi上内存泄漏

C# 子窗体为空的mdi上内存泄漏,c#,.net,memory-leaks,mdi,C#,.net,Memory Leaks,Mdi,我创建了一个空白应用程序,其中一个mdi父窗体从菜单中打开一个空白子窗体 当子窗体的父窗体设置为mdi时-系统似乎没有释放内存-因此发生泄漏 未设置父窗体时,将删除子窗体 有人知道为什么这个明显的内存泄漏可以解决吗 我一直在使用ants内存分析器 Bob.一种可能性是,如果订阅了对象上的事件,则不会对其进行垃圾收集。您必须确保没有任何内容引用该对象。我认为最常见的内存泄漏源是未正确释放的事件,但您说您查找了它 如果不查看代码,就很难准确地知道泄漏的位置。我建议你使用。我以前使用过它,它似乎比An

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

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

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

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

我一直在使用ants内存分析器


Bob.

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

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


如果不查看代码,就很难准确地知道泄漏的位置。我建议你使用。我以前使用过它,它似乎比Ants好。

这似乎是SP1引入的.net framework 2.0中的一个缺陷,SP2中仍然存在

只需阅读以下博文SciTech software,.net内存分析器的制造商:

要解决此问题,请将以下代码添加到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对此进行了测试,它解决了我的问题。

只是为了澄清这是一个完全空白的mdi。。唯一的代码如下所示,并附加到菜单单击:Dim frm as New Baby frm.mdipalent=Me frm.Show(),因此没有我自己添加的事件处理程序。唉,没有关联的事件-上面的注释包括使用的代码(非常普通).ants profiler相当不错-我使用它在真实应用程序中查找漏洞。然而,通过这个工具,我发现我甚至不能让一个基本的windows mdi应用程序失去它的句柄。我想如果我不能让windows mdi不泄漏内存,那么我就没有机会修复一个复杂的应用程序。鉴于上述示例,是否需要进行任何释放调用?真正释放内存的唯一方法是从对子窗体的mdi调用中删除me.parent=me,这实际上会阻止窗体成为mdi子窗体。我也在实际应用中使用了.NET memory Profiler,即使只有引用丢失的数据都在框架objs中。无论如何,我相信您有可能(但不太可能)在框架中发现bug。问题是我无法复制它。因此,很难找到任何解决方案或解决办法,如果有的话。你能和我们分享你的代码吗?谢谢你的回复。是的,一个框架问题可能是可能的-你已经通过网络听到了这方面的消息。我很高兴与大家分享这段代码——尽管它并不特别令人惊讶:复制步骤:1。创建一个新项目(vb.net)2。创建新的mdi表单3。创建一个新的空白表单-将其命名为Baby 4。在顶部的菜单上添加一个新按钮,其代码如下:Dim frm As new Baby frm.MdiParent=Me frm.Show(),这就是我所做的一切,我仍然看到内存在整个应用程序关闭之前不会被释放。这并不好,因为真正的应用程序整天都是打开的。我已经使用您建议的步骤在我的机器上运行了一些测试。我发现,即使所有的婴儿都关了门,一张婴儿的表格仍会被保留在记忆中。通过对参考文献的研究,我发现
Form
s有一个名为
FormerlyActiveMdiChild
的属性。MdiParent窗体保留对此属性中最后一个关闭的子对象的引用。这看起来像是内存泄漏,但事实上并非如此。只有一个实例将保留在那里,因此内存配置文件不会上升。那看起来像你找到的吗?在你创建并关闭了几个婴儿后,婴儿的数量增加了吗?