[PyQt] Virtual methods and an extra reference

Phil Thompson phil at riverbankcomputing.com
Sun Jul 6 17:31:18 BST 2008

On Wed, 18 Jun 2008 18:03:49 +0000 (UTC), Kevin Watters
<kevinwatters at gmail.com> wrote:
> There's a comment in siplib.c:5300ish in the sip_api_is_py_method
> function that I'll reproduce here:
> /*
>  * Note that the callable is never garbage collected.  The main
>  * reason for this is that it's not possible to get hold of the
>  * method cache without make incompatible changes to the SIP
>  * API, particularly to support the cyclic garbage collector.
>  * It would be a lot easier if the cache was held in the
>  * Python object rather than the derived C++ class (and this
>  * function would be passed a cache index instead of a pointer
>  * to the cache entry).  Dropping the cache completely should
>  * also be considered which would have the advantage of making
>  * monkey patching predictable.  With cyclic garbage collector
>  * support we could also just save a reference to a
>  * reimplementation that was a method rather than save the
>  * separate components, which would also allow a borrowed
>  * reference to the reimplementation to be returned so that the
>  * virtual handler wouldn't need to decrement its reference
>  * count.
>  */
> I'm tracking down a memory leak in my app--and I think it's boiling
> down to a virtual method on one of my classes that has an extra
> reference, one not coming from any Python object.
> This virtual method is /bound/, though, so my understanding is that
> it carries "self" in its im_self attribute and is keeping the rest of
> my objects alive when they shouldn't be. Should I be worried about
> that comment--and specifically that objects using virtual methods will
> leak? Reading the code seems to say otherwise; that the comment is
> applying to the case when a monkeypatched callable has been set on the
> class--not when you override a method in a subclass like usual.
> Phil, do you mind explaining the limitation this comment is describing
> a bit more? I appreciate any help!

It should be fixed in tonight's SIP snapshot. It was just a Py_DECREF()
that got dropped.


More information about the PyQt mailing list