It is __del__ calling twice for some instances?

Max Yuzhakov gmt at sdf-eu.org
Fri Aug 18 18:00:57 EDT 2006


Duncan Booth wrote:

 DB>  I figured out what is going on in the code to deallocate an old-style class 
 DB>  instance:
 DB> 
 DB>  The reference count is temporarily incremented.
 DB> 
 DB>  If the class has a __del__ method then a descriptor is created for the 
 DB>  method and called. When the call returns, the descriptor is released.
 DB> 
 DB>  Then the object itself is released using special code to avoid a recursive 
 DB>  call to the deallocator.
 DB> 
 DB>  However, if the trashcan mechanism is invoked by the attempt to release the 
 DB>  descriptor, it actually queues the descriptor in the trashcan. Since the 
 DB>  descriptor contains a reference to the object it has effectively 
 DB>  resurrected it. This means the special code to avoid the recursive call 
 DB>  simply decrements the reference count but does not release anything (the 
 DB>  object has been resurrected by the descriptor). When the descriptor is 
 DB>  later released the __del__ method is triggered a second time.

Thank You for so detailed explanation!
-- 
GMT More Then ...



More information about the Python-list mailing list