析构函数和垃圾收集器之间的区别

时间:2012-02-26 16:56:09

标签: .net garbage-collection destructor

我想知道析构函数和垃圾收集器之间有什么区别,析构函数用于在应用程序生命周期结束时处理所有未使用的对象,同样是使用垃圾收集器,垃圾收集器可以手动在应用程序结束时调用或完成,与析构函数一样,都是可选的并且用于处理未引用的对象,任何人都可以指出我的确切差异

4 个答案:

答案 0 :(得分:7)

垃圾收集器和终结器/析构函数是内在链接的 - 但是,大多数对象不需要(也没有)析构函数。它们在托管代码中实际上非常罕见,通常用于确保释放非托管资源。如果一个对象有一个析构函数/终结器,垃圾收集器会在收集的同时调用它(可能在下一个传递中)。垃圾收集是非确定性的 - 它发生时会发生 - 通常与记忆压力有关。

然而,更常见的是IDisposable。这允许更可预测的模式来释放资源现在(而不是在下一次发生GC时)。通常,具有终结器的类是IDisposable,Dispose()实现禁用析构函数(如果我们已经清理了则不需要它)。请注意,Dispose()与垃圾收集无关,但通过“using”语句提供语言支持。

IDisposable 比终结者更常见。您有责任确保任何IDisposable被处置。附加说明:处理某些东西不会导致物体被收集;这只是由GC根据GC选择的任何时间表完成的。处置,而是释放相关资源。例如,在GC发生之前,您不希望文件被锁定打开; Dispose()在这里解锁文件(通过释放OS文件句柄)。

答案 1 :(得分:6)

析构函数是一个特殊的成员函数,在销毁对象时调用它。这是一个类运行的最后一个方法。

垃圾收集器是框架的一部分,自动管理内存,并且不确定地收集未引用的对象以避免内存泄漏。

答案 2 :(得分:3)

垃圾收集器是.NET环境的一部分,它跟踪对象并确保在不再需要对象时从内存中删除它们。

析构函数是类设计的一部分。它与构造函数相反。当你声明它时,GC会在它破坏一个物体时调用它。

Here is the MSDN documentation.

答案 3 :(得分:0)

垃圾收集器主要通过将它可以找到的所有对象复制到RAM的新部分,然后核对旧区域来工作;它既不知道也不关心是否留下五个或五十万件物品。请注意,除了查找实时强引用引用的所有对象之外,垃圾收集器还可以找到一些其他对象,包括覆盖Finalize的对象,用作监视器锁的对象,WeakReference对象所针对的对象等。在从轨道上挖掘旧区域之前,垃圾收集器必须处理它可能仍然坐在那里的任何“特殊”物体。

除此之外,垃圾收集器还有一个已注册终结器的所有对象的列表;它将检查该列表上的所有对象,以查看它们是否已被复制到新的内存区域。如果找到任何尚未存在的对象,则它们将从具有已注册终结器的对象列表中删除,并添加到应尽快运行Finalize方法的对象列表中。对具有已注册终结器的所有对象完成此操作后,需要立即完成的对象列表上的任何对象以及这些对象保存引用的任何对象都将被复制到新区域。