如何在 C# 中删除对象后完全清除内存
本文关键字:清除 内存 对象 删除 | 更新日期: 2023-09-27 18:32:29
使用对象后如何清除内存?
在这个论坛上读到了很多问题,每个人都说:使用myObject=null
删除你的对象。喜欢这个:
Car myCar = new Car();
//do stuff
myCar.horn();
myCar = null; // <-- DELETE
在我的程序中,我正在创建很多Form
(public partial class Myform: Form
)。
喜欢这个:
ArrayList listOfMyForms = new ArrayList();
for(int i = 0; i < 100; i++)
{
listOfMyForms.Add(new Myform());
}
所以。。我做了100次对象...
但是如果我使用删除方法删除所有内容(调用循环):
public void remove(Myform someForm)
{
listOfMyForms.Remove(someForm);
someForm = null;
GC.Collect();
}
我可以在Visual Studio部分看到完整的内存(20MB):诊断工具(进程监视器)
在创建 100 个表单之前是 16mb 的内存。
创建 100 个表单后是 20mb 的内存。
清理后,所有表单的内存为20mb。
所以。。如何释放我的内存?
我希望,你理解我的问题。对不起,我的英语不好:-)
我认为这些东西会帮助你理解:
- 当对象由
GC
收集时,关联的内存可能会也可能不会释放到操作系统。CLR
自动管理此过程。 - 当呼叫
GC.Collect()
时,它会开始收集并立即返回。它不会等待完成清理。要强制程序等待,您需要在GC.Collect()
后调用GC.WaitForPendingFinalizers()
。 -
Form
类正在实现IDisposable
并使用非托管资源。要清洁它,您需要致电Dispose(true)
仅供参考:在大多数情况下,您真的不需要关心手动删除对象,希望您知道自己在做什么。
使用下面的代码。
public void remove(Myform someForm)
{
someForm.Dispose(true)
}
因为窗体使用托管代码。使用托管代码时,需要实现 IDisposable,并在不再需要对象时调用 Dispose 方法。