我知道实现IDisposable
的所有对象应该在不再需要时立即处理掉,以释放其非托管资源使用的内存。
我的问题与我知道的事实的对象有关,直到主机进程本身终止为止。如果我处理它们会不会有任何区别?当进程死亡时,是否存在未释放内存的可能性? GDI对象怎么样?即使没有处理过程,GDI句柄是否会在进程死亡时被释放?
我完全明白,无论如何都要妥善处理所有物品。我纯粹是出于好奇而问。
答案 0 :(得分:7)
这取决于有问题的对象(资源)。
当进程终止所有非托管内存时,即使关联的终结器无法运行,也会释放文件句柄和其他OS资源。
但我对数据库句柄,命名互斥体等不太确定。
因此,在您认为不调用Dispose之前,您必须知道资源类型及其与流程的关系。更容易从一般原则中调用Dispose()。
但这是理论上的争论,大多数课程都会使用SafeHandle : CriticalFinalizerObject
。所以我认为这不是一个真正的实际问题。
答案 1 :(得分:2)
没有。通过 design ,IDisposable可用于允许程序尽早释放非托管资源,而不是终结器可以完成。无论何时执行垃圾收集,它都会在相当不可预测的时间运行,通常以后。你无法预测何时会发生这种情况。
在程序退出时处置没有意义,终结器可以保证在卸载AppDomain之前运行并且进程关闭。
据说,有一些IDisposable滥用,实际期望你调用它的代码。但这通常基于使用语句,所以不太可能会遇到这种情况。