忽略IDisposable会导致内存泄漏吗?

And*_*bel 12 .net c# idisposable

我写答案的评论中,我们讨论了内存泄漏以及IDisposable我们没有得出任何真正结论的地方.

处理非托管资源的类可能会实现IDisposable.如果忽略它并且既没有调用Dispose也没有包装对象using- 会导致非托管资源被泄露吗?或者,当GC收集物体时,它会被正确清理吗?

我们可以假设处理非托管资源的类具有正确的实现IDisposable,包括终结器等.

Hen*_*man 14

它不会导致内存泄漏.事实上,Dispose与内存管理完全无关.

它会造成资源泄漏.虽然GC通常会清理它,但这可能太罕见而且太晚了.

省略Dispose(using)可能会减慢甚至崩溃你的应用程序.在文件资源或Db连接的情况下,它甚至可能导致其他应用程序出现问题.

  • 忽略IDisposable可能会导致应该在有限的内存量(如果IDisposable被正确使用)中运行的程序需要无限量的内存.如果程序的内存需求中不必要的无限增长被视为内存泄漏,则忽略IDisposable会导致内存泄漏. (2认同)
  • 如果不是 IDisposable.Dispose,您建议 IEnumerator 使用什么模式来清理其事件?我建议除非这样的设计非常不切实际或不可能,否则所有需要显式清理的对象都应该在调用 IDisposable.Dispose 方法时执行所有必要的清理。我认为任何需要调用其他方法的设计都是高度可疑的。 (2认同)

Joe*_*orn 9

我不会导致托管内存泄漏.它可能导致引用的非托管代码泄漏.但它更糟糕的是:现代系统上的内存足够丰富,你可以经常使用一段时间的漏洞.见证Mozilla Firefox:曾经(它仍然?)像筛子一样泄漏,数百万人乐于使用它.

更大的问题是其他资源可能与内存无关.示例包括数据库连接,系统I/O句柄,套接字句柄,文件句柄等.如果您不小心正确使用IDisposable,这些都是您可以在自己的系统上轻松创建拒绝服务情况的所有项目.