不保证会调用析构函数

时间:2011-07-14 11:43:15

标签: c# .net

我遇到了以下引语:“不能保证会被称为解析器。”这让我有点害怕。

接着说,即使是try finally块也可能被中断,导致内存泄漏。 它确实通过将代码置于CER(受约束的执行区域)或从CriticalFinalizerObject派生来提供解决方案。

我的问题是

  1. 使用CriticalFinalizerObject,如果有的话有哪些传统?
  2. 你发现他们的任何案例都来自CriticalFinalizerObject真的很有用吗?
  3. 当我开始遇到内存泄漏时,我是否应该只担心使用它?

4 个答案:

答案 0 :(得分:4)

你为什么依赖于解析器?大部分时间你都不需要它们。

或许看一下IDisposeable和Dispose Pattern。

这里有一些链接让我理解这个主题

- > Everybody thinks about garbage collection the wrong way

- > How To implement dispose Pattern

- > Implementing Finalize and Dispose to Clean Up Unmanaged Resources

答案 1 :(得分:1)

关于问题3:内存泄漏通常是由以下原因引起的:

  • 未释放未管理的资源。对于那些,使用IDisposable(在终结器中对Dispose()进行后备调用)是最好的方法。

  • 对由于其他对象仍然指向它们而维护的托管对象的引用,即使它们应该被删除。 IHMO,这是一个代码质量问题,而不是垃圾收集的低级问题。

除非你遇到实际的内存泄漏,否则你甚至不应该担心它,也不要试图强迫任何行为。

答案 2 :(得分:0)

我建议将IDisposable接口用于需要销毁的所有资源,并在using块中使用它们。

答案 3 :(得分:0)

通常,正常终结器和关键终结器之间的差异仅在AppDomain卸载时变得很重要。由于大多数非托管资源会在进程卸载时自动消失,因此如果要在保持进程运行的同时干净地卸载AppDomain,通常只需担心关键的最终化。