这对我来说从未真正发生过,因为当我从C ++迁移到C#时,我从来没有多想过,但是......有没有办法强制释放内存,然后像{{1}那样},数组,甚至没有实现List
的对象?让我解释一下我的想法......
在C ++中,如果我想创建一个动态数组,我会这样写:
IDisposable
...但是,当我完成时,我必须删除它,否则会发生内存泄漏:
int* arr = NULL;
arr = new int[10];
嗯,似乎在C#中没有类似的东西,或者在那里?我一直无法找到。似乎只有强制处理实现delete [] arr;
接口的对象。那么,设置说...数组到IDisposable
并让GC清理那种情况下清理内存的唯一方法吗?
我已经读过null
并且强迫早期收集不受欢迎,所以我想知道这些类型是否有任何单数?我意识到C#不是C ++,我只是想知道我是否遗漏了一些明显的东西。
答案 0 :(得分:2)
好吧,第一位可能是错误的,除非将say ...数组设置为
null
并让GC清理在这种情况下清理内存的唯一方法
arr
实际上(比方说)另一个对象的一个字段将继续存在很长一段时间。在您的示例中,arr
是一个局部变量,GC和JIT合谋(当您运行发布代码而不是调试时)非常准确地知道这些变量的生命周期。他们知道 arr
没有再次使用,并且有资格进行垃圾回收 - 无需为其分配null
。
现在,对于更广泛的问题 - 不,没有办法急切地回忆内存。它实际上是更多工作,让你告诉GC"请现在收回这块内存" 1 。正如你所说的,GC.Collect
是不受欢迎的,因为即使那不是真的"请收回这块记忆我不再使用"它' s"请运行完整分析以确定所有不再需要的内存块,然后执行压缩等等#34;。
1 托管内存系统有一种简单的方法来跟踪新分配的可用内存 - 它位于所有先前分配的块的末尾。因此压缩是释放内存可以重用的唯一方法。
答案 1 :(得分:1)
不,现在没有办法释放.Net中单个托管对象使用的内存。
你可以
GC.Collect();GC.WaitForPendginFinalizers()
答案 2 :(得分:0)
IDisposable
接口的类实现方法Dispose
,这是强制处理对象的方法。
但是C#中有一个垃圾收集器,它会自动删除所有未引用的对象。这意味着当您离开其上下文等时,将自动删除所有局部变量
因此,在许多情况下,调用Dispose
不是必需的......
一般来说,如果你想在使用后释放对象的内存,我建议使用using
语句:
using (... some object creation ...)
{
... using object ...
}
// here, the object is disposed