试图替换Controls.Clear()以避免内存泄漏不起作用 - 为什么?

时间:2011-10-09 21:01:55

标签: c# winforms memory-leaks

我换了:

panel.Controls.Clear();

使用:

Clear(panel);

其中:

public static void Clear(Control ctrl)
{
    while (ctrl.Controls.Count > 0) ctrl.Controls[0].Dispose();
}

我收到以下错误:Application.Run(new Form1()); System.ObjectDisposedException未处理 无法访问已处置的对象。 对象名称:'标签'。

知道为什么会这样吗?

感谢。

编辑: 见How to Clear() controls without causing a memory leak

编辑:对不起,我可能正在处理我想从其父级中删除的内容。我会检查一下。谢谢你的回答。

3 个答案:

答案 0 :(得分:3)

在正常情况下,

Dispose() 没有与内存有关。它不释放内存,它不会从集合中删除对象,也不会调用垃圾收集器。相反,.Dispose()的目的是清理非内存资源:数据库连接,套接字,设备句柄,gdi句柄等。

这可以帮助您修复内存问题的唯一方法是,如果您使用的是自定义控件,每个控件都依赖于非托管(非.Net)dll中的代码。

答案 1 :(得分:0)

您需要移除您处置的控件,但可能有更好的方法:

public static void Clear(Control ctrl)
{
    foreach(Control c in ctrl.Controls) c.Dispose();
    ctrl.Controls.Clear();
}

答案 2 :(得分:0)

我可能会稍后在代码中处理一些Control