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

时间:2016-01-30 12:34:05

标签: c# memory

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

在这个论坛上阅读了很多问题,每个人都说:用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次对象......

但是如果我删除所有使用remove方法(调用for循环):

public void remove(Myform someForm)
{
    listOfMyForms.Remove(someForm);
    someForm = null;
    GC.Collect();
}

我可以在Visual Studio部分看到完整的内存(20mb):诊断工具(进程监视器

在创建100个表单之前,内存为16mb。

创建100个表单后,内存为20mb。

清理完所有表格后,内存为20mb。

那么..我怎样才能释放自己的记忆?

我希望,你了解我的问题。抱歉我的英文不好: - )

2 个答案:

答案 0 :(得分:3)

我认为这些事情会帮助你理解:

  1. GC收集对象时,关联的内存可能会也可能不会被释放到OS。 CLR自动管理此流程。
  2. 当致电GC.Collect()时,它开始收集并立即返回。它不等待完成清理。要强制您的程序等待,您需要在GC.WaitForPendingFinalizers()之后致电GC.Collect()
  3. Form类正在实施IDisposable并正在使用非托管资源。要清洁它,您需要致电Dispose(true)
  4. 仅供参考:在大多数情况下,你真的不需要关心手动删除对象,希望你知道你在做什么。

答案 1 :(得分:0)

使用下面的代码。

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

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