[Python-ideas] Why not break cycles with one del? (original) (raw)

Guido van Rossum guido at python.org
Tue Sep 14 05:07:10 CEST 2010


On Mon, Sep 13, 2010 at 8:04 PM, Tim Peters <tim.peters at gmail.com> wrote:

[Nick Coghlan]

Alternatively, when building finalizers, build two lists: one for objects with del methods and one for objects that are reachable from objects with del methods. [Greg Ewing] But since it's a cycle, isn't everything in the cycle going to be reachable from everything else? Note that I was sloppy in saying that CPython's cyclic gc only sees trash objects in cycles.  More accurately, it sees trash objects in cycles, and objects (which may or may not be in cycles) reachable only from trash objects in cycles.  For example, if objects A and B point to each other, that's a cycle.  If A also happens to point to D, where D has a del method, and nothing else points to D, then that's a case where D is not in a cycle, but is nevertheless trash if A and B are trash.  And if A and B lack finalizers, then CPython's cyclic gc will reclaim D, despite that it does have a del. That pattern is exploitable too.  If, e.g., you have some resource R that needs to be cleaned up, owned by an object A that may participate in cycles, it's often possible to put R in a different, very simple object with a del method, and have A point to that latter object instead.

Yeah, I think we even recommended this pattern at some point. ISTR we designed the new io library to exploit it.

-- --Guido van Rossum (python.org/~guido)



More information about the Python-ideas mailing list