如何在 C# 中删除对象后完全清除内存

本文关键字:清除 内存 对象 删除 | 更新日期: 2023-09-27 18:32:29

使用对象后如何清除内存?

在这个论坛上读到了很多问题,每个人都说:使用myObject=null删除你的对象。喜欢这个:

Car myCar = new Car();
//do stuff
myCar.horn();
myCar = null; // <-- DELETE

在我的程序中,我正在创建很多Formpublic 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。


所以。。如何释放我的内存?

我希望,你理解我的问题。对不起,我的英语不好:-)

如何在 C# 中删除对象后完全清除内存

我认为这些东西会帮助你理解:

  1. 当对象由GC收集时,关联的内存可能会也可能不会释放到操作系统。 CLR自动管理此过程。
  2. 当呼叫GC.Collect()时,它会开始收集并立即返回。它不会等待完成清理。要强制程序等待,您需要在GC.Collect()后调用GC.WaitForPendingFinalizers()
  3. Form类正在实现IDisposable并使用非托管资源。要清洁它,您需要致电Dispose(true)

仅供参考:在大多数情况下,您真的不需要关心手动删除对象,希望您知道自己在做什么。

使用下面的代码。

public void remove(Myform someForm)
{
    someForm.Dispose(true)
}

因为窗体使用托管代码。使用托管代码时,需要实现 IDisposable,并在不再需要对象时调用 Dispose 方法。