[Metakit] memory leak in python bindings

Jack Diederich jack at performancedrivers.com
Tue Oct 3 16:06:36 CEST 2006


On Mon, Oct 02, 2006 at 05:52:29PM -0700, Brian Warner wrote:
> 
> Hi all..
> 
> I spent some time a few weeks ago tracking down a memory leak in the metakit
> python bindings. I've come up with a patch which seems to fix the issue.. I'm
> hoping that someone with more experience with the code than me could take a
> look at it and consider applying it upstream.
> 
<snip>
> --- old-metakit-2.4.9.5/python/scxx/PWOMapping.h	2006-08-09 00:18:33.000000000 -0700
> +++ new-metakit-2.4.9.5/python/scxx/PWOMapping.h	2006-08-09 00:18:33.000000000 -0700
> @@ -55,9 +59,11 @@
>    //PyMapping_GetItemString
>    //PyDict_GetItemString
>    PWOMappingMmbr operator [] (const char* key) {
> +    // note: this PyMapping call creates a new reference
>      PyObject* rslt = PyMapping_GetItemString(_obj, (char*) key);
>      if (rslt == NULL)
>        PyErr_Clear();
> +    Py_XDECREF(rslt); // PWOMappingMmbr claims its own refcnt, so decref now
>      PWOString _key(key);
>      return PWOMappingMmbr(rslt, *this, _key);
>    };

Looks good to me.  I tried looking for similar refleaks but
quickly got lost between the PyMapping_* calls and the PyDict_*
calls (PyDict_* calls generally steal references, the abstract
interface doesn't).  I think the _obj member must always be a 
PyDict or there would be a lot of core dumping going on.

-Jack


More information about the Metakit mailing list