在C#中强制删除/处理

时间:2014-03-21 07:04:17

标签: c# dispose delete-operator

这对我来说从未真正发生过,因为当我从C ++迁移到C#时,我从来没有多想过,但是......有没有办法强制释放内存,然后像{{1}那样},数组,甚至没有实现List的对象?让我解释一下我的想法......

在C ++中,如果我想创建一个动态数组,我会这样写:

IDisposable

...但是,当我完成时,我必须删除它,否则会发生内存泄漏:

int* arr = NULL;
arr = new int[10];

嗯,似乎在C#中没有类似的东西,或者在那里?我一直无法找到。似乎只有强制处​​理实现delete [] arr; 接口的对象。那么,设置说...数组到IDisposable并让GC清理那种情况下清理内存的唯一方法吗?

我已经读过null并且强迫早期收集不受欢迎,所以我想知道这些类型是否有任何单数?我意识到C#不是C ++,我只是想知道我是否遗漏了一些明显的东西。

3 个答案:

答案 0 :(得分:2)

  

将say ...数组设置为null并让GC清理在这种情况下清理内存的唯一方法

好吧,第一位可能是错误的,除非arr实际上(比方说)另一个对象的一个​​字段将继续存在很长一段时间。在您的示例中,arr是一个局部变量,GC和JIT合谋(当您运行发布代码而不是调试时)非常准确地知道这些变量的生命周期。他们知道 arr没有再次使用,并且有资格进行垃圾回收 - 无需为其分配null

现在,对于更广泛的问题 - 不,没有办法急切地回忆内存。它实际上是更多工作,让你告诉GC"请现在收回这块内存" 1 。正如你所说的,GC.Collect是不受欢迎的,因为即使那不是真的"请收回这块记忆我不再使用"它' s"请运行完整分析以确定所有不再需要的内存块,然后执行压缩等等#34;。

1 托管内存系统有一种简单的方法来跟踪新分配的可用内存 - 它位于所有先前分配的块的末尾。因此压缩是释放内存可以重用的唯一方法。

答案 1 :(得分:1)

不,现在没有办法释放.Net中单个托管对象使用的内存。

你可以

  • 自己管理本机内存(即GlobalInoc函数的PInvoke)
  • 在释放对特定托管对象的所有非弱引用(GC.Collect();GC.WaitForPendginFinalizers()
  • 之后强制完成垃圾回收

答案 2 :(得分:0)

IDisposable接口的类实现方法Dispose,这是强制处理对象的方法。

但是C#中有一个垃圾收集器,它会自动删除所有未引用的对象。这意味着当您离开其上下文等时,将自动删除所有局部变量

因此,在许多情况下,调用Dispose不是必需的......

一般来说,如果你想在使用后释放对象的内存,我建议使用using语句:

using (... some object creation ...) 
{
    ... using object ...
}
// here, the object is disposed