2011-07-14 56 views
8

我遇到以下报价“Desctructors不保证被调用。”这让我感到害怕。破坏者不保证被称为

它继续说,即使try finally finally块也会中断,导致内存泄漏。 它通过将您的代码放入CER(受限执行区域)或从CriticalFinalizerObject派生出解决方案。

我的问题是

  1. 有什么用CriticalFinalizerObject的tradoffs,如果有的话?
  2. 他们的任何案件是你发现从CriticalFinalizerObject得到真的有用吗?
  3. 当我开始运行内存泄漏时,我是否应该只使用它?
+10

我不认为你应该为此担心。 –

+2

您能否给我们链接到源代码请。 –

+0

@Jethro:'try/finally'不能被打断,最后的代码将会_always_运行.. @ –

回答

3

你为什么依赖于desctructors?大多数时候你不需要它们。

也许看看IDisposeable和Dispose模式。

这里说helpes我理解这个问题的一些链接

- >Everybody thinks about garbage collection the wrong way

- >How To implement dispose Pattern

- >Implementing Finalize and Dispose to Clean Up Unmanaged Resources

+0

我知道IDisposable类做了什么以及如何使用它,但正如我的帖子所述,这可能会中断,导致内存泄漏。 – Jethro

+0

好的。但是这种情况应该像其他帖子中提到的那样用一个Try {} finally {}块来显式处理。 像Raymong Chen说的: >>一个正确编写的程序不能假定终结器将永远运行。<< –

+0

我会重命名您的最后一个链接为“如何不清理非托管资源”。非托管资源是应该使用关键定稿的一件事。 – CodesInChaos

0

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

+2

那么,'使用'块(技术上)与try-finally不同呢? (是的,这个问题很有说服力。) – Heinzi

+2

这没有帮助。 “使用”只是'try/finally'的语法糖。 –

1

关于问题3:内存泄漏通常会引起:不被释放

  • 不受管理的资源。对于那些使用IDisposable(在终结器中使用Dispose()的回调函数)是最好的方法。

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

除非您遇到实际的内存泄漏,您甚至不应该担心它,而不会试图强制任何行为。

+0

这似乎是我得到形式人的一般答案。感谢您的回答。 – Jethro

0

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