为什么定义__del__的循环引用对象在Python中无法收集?

时间:2011-02-13 15:04:07

标签: python

如果GC无法清除它会导致内存泄漏吗?

3 个答案:

答案 0 :(得分:7)

这是垃圾收集的标准问题。

这不是关于内存泄漏,而是关于循环引用本身,以及由那些可能需要清理的对象管理的其他类型的资源。引用创建一个依赖项 - 在删除引用的所有对象之前,不能删除它,因为它可能需要在清理期间对这些引用的对象执行某些操作。

作为一个人为的例子,两个对象可能各自都有日志文件,在清理过程中可能需要将日志消息写入自己的日志文件和另一个日志文件。您无法先清理任何一个对象,因为这样做会让另一个对象无法执行清理。

基本规则是你可以拥有可靠的析构函数(如在C ++中)或垃圾收集(如Python,Java ......),但不能同时使用。虽然原则上,代码的静态分析(或者在大多数情况下甚至是视觉检查)可以告诉您哪些类可能存在此循环引用问题。

答案 1 :(得分:6)

来自docs for gc.garbage

  

Python不会收集此类周期   一般来说,它是自动的   Python无法猜测   运行安全的安全顺序   __del__()方法。如果您知道安全订单,可以强制解决问题   检查垃圾清单,和   由于你的明确打破周期   列表中的对象。

答案 2 :(得分:2)

这取决于你在__del__中做了什么。如果您使用它来处理对其他对象的引用,则可能是这样。

有些讨论在docs。更合适的问题是你试图在__del__中做什么,以及它是否应该在代码中的其他地方明确地完成。