为什么要调用Dispose()?内存泄漏不会发生?

Bob*_*orn 12 c# memory-leaks memory-management idisposable

编辑:我的问题是没有得到我正在寻找的主要答案.我不清楚.我真的很想知道两件事:

  1. 不能调用Dispose()导致内存泄漏?
  2. 如果你有一个大型程序并且从不在任何IDisposable对象上调用Dispose(),那么最糟糕的事情是什么?

我的印象是,如果Dispose()未在IDisposable对象上调用内存泄漏.

根据这个帖子的讨论,我的看法不正确; 如果Dispose()未调用,则不会发生内存泄漏.

那么为什么打扰Dispose()呢?是否只是立即释放资源,而不是以后的某个时间?如果你有一个大型程序并且从不调用Dispose()任何IDisposable对象,那么最糟糕的事情是什么?

Sam*_*eff 10

Dispose用于释放非托管资源.这可能意味着内存,如果一个类分配了非托管内存,但它通常是本机对象和资源,如打开文件和数据库连接.

您经常需要在一个本身没有任何非托管资源的类上调用Dispose,但它确实包含另一个可以一次性使用且可能具有非托管资源的类.

对于开发人员来说,有时也可以实现dispose以确保确定性的最终确定 - 保证资源被释放的顺序.

另请注意,实现dispose的类通常还有一个终结器,以便在Dispose未调用时释放resourcdes .具有终结器的对象具有与没有终结器的类不同的生命周期.当他们准备好GC时,GC会看到他们有一个终结器,而不是在GC准备就绪时立即收集对象,它将它放入终结队列.这意味着该对象可用于一次额外的GC迭代.当你调用dispose时,通常(但不要求)调用GC.SuppressFinalize()实现意味着不再需要调用终结器.

如果一个类实现IDisposable,你应该总是调用Dispose().


Tim*_*lds 7

虽然其他一些答案似乎暗示你可以逃避不叫它,这是非常糟糕的建议.你应该总是调用Dispose任何IDisposable资源.

一些.NET对象具有所谓的"终结器" - 您可以在自己的类上定义,但是您很少在典型的C#程序员代码中看到它们.终结器是垃圾收集器销毁对象时运行的,有时会调用Dispose- 但只有当类的实现者这样做时才会调用.

最好的做法是永远Dispose- 无论如何.我使用过很多库,没有调用Dispose资源导致内存泄漏,连接泄漏,操作系统资源泄漏或其他类型的可怕性.垃圾收集器不会协调问题,因为它们没有实现任何自定义终结器.

请参阅相关内容:垃圾收集器是否会为我调用IDisposable.Dispose?


Zim*_*oot 2

Dispose()旨在释放垃圾收集器不会释放的资源,例如数据库连接。这些资源也应该在终结器中释放,但是终结器比该Dispose()方法慢得多。