Bob*_*orn 12 c# memory-leaks memory-management 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().
虽然其他一些答案似乎暗示你可以逃避不叫它,这是非常糟糕的建议.你应该总是调用Dispose任何IDisposable资源.
一些.NET对象具有所谓的"终结器" - 您可以在自己的类上定义,但是您很少在典型的C#程序员代码中看到它们.终结器是垃圾收集器销毁对象时运行的,有时会调用Dispose- 但只有当类的实现者这样做时才会调用.
最好的做法是永远Dispose- 无论如何.我使用过很多库,没有调用Dispose资源导致内存泄漏,连接泄漏,操作系统资源泄漏或其他类型的可怕性.垃圾收集器不会协调问题,因为它们没有实现任何自定义终结器.
请参阅相关内容:垃圾收集器是否会为我调用IDisposable.Dispose?
| 归档时间: |
|
| 查看次数: |
6779 次 |
| 最近记录: |