GC.Collect不会调用IronPython析构函数

时间:2015-09-23 14:21:10

标签: c# garbage-collection clr ironpython dynamic-language-runtime

我有一个简单的IronPython类,它实现了析构函数(__del__)并将一些东西写入控制台 在里面。如果没有对实例的引用,并且为了测试目的而调用GC.Collect,则永远不会调用析构函数。它是否正确? DLR / IP是否在clr / gc之上拥有自己的内存管理?

1 个答案:

答案 0 :(得分:2)

这可能是一个比你意识到的更广泛的问题。

具有终结器的类的典型行为是GC将项目移动到collect上的终结器队列中。对象队列是单独处理的(尽管您可以调用g来阻止它直到完成)。这意味着该对象仍然是有根的(即使不是来自您的代码,也可以从终结器队列中引用它!)因此通常会在GC中存活并升级到下一代。

因此,在清理项目之前,您可能需要GC 两次。这也意味着终结器将根据定义发生在收集后的任意时间。但是,如果你打电话给GC.WaitForPendingFinalizers(),你应该看到你的终结者。

为了避免所有这些不良行为,通常会实现GC.WaitForPendingFinalizers()接口来显式处理非托管资源的清理。如果您查看典型的example implementation from documentation,您会发现IDisposable方法通常会调用Dispose。这意味着,如果您在代码中彻底丢弃对象,则根本不需要调用终结器。