在终结器中枚举列表

时间:2013-12-23 19:27:14

标签: c# finalizer

我有一个类可以保存非托管资源列表。这些应该在终结器中清理,以确保没有泄漏。但是,它们包含在List<IntPtr>.中我对这种情况有几个问题:

  • 我是否认为枚举列表中的列表是不安全的 终结者,因为列表可能已经存在 收集垃圾?
  • 是否是在实现终结器的类中包装每个单独资源的唯一方法,从而给垃圾收集器增加了更大的压力?然后列表会存储这个类吗?

2 个答案:

答案 0 :(得分:0)

关于最终确定指南的简短说明

  

对象的Finalize方法应该释放任何外部资源   对象拥有。此外,Finalize方法应该仅发布   对象所持有的资源。 Finalize方法应该   不引用任何其他对象

http://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx

Finalize和Dispose指南位于文章底部

答案 1 :(得分:0)

我在这里找到答案: https://stackoverflow.com/a/20167998/553294。这里supercat声明:

  

如果一个对象有一个活动的终结器,那么如果GC会收集它(但是对于终结器的存在),GC会将它添加到一个对象队列中,这些对象的终结器应该尽快运行,并且已经这样做了,取消激活它。队列中的引用将阻止GC收集对象,直到终结器运行;一旦终结器完成,如果该对象没有其他引用并且它没有重新注册其终结器,它将不再存在。

因此,在终结队列中,对象被认为是可达的,这意味着内部列表也被认为是可到达的。因此,从终结器访问列表是安全的。