SWIG typemap leading to a memory leak

Skip Montanaro skip at pobox.com
Mon Aug 18 16:44:18 EDT 2003


You need to DECREF the result of PyInt_FromLong(key):

    typemap(out) int {
       int key;
       PyObject *obj;
       $result = PyDict_New();  
       for(key=0; key < $1; key++) {
         obj = PyInt_FromLong(key);
         /* obj has a refcount of 1 */
         PyDict_SetItem($result, obj, obj);
         /* obj has a refcount of 3 */
         Py_DECREF(obj);
         /* obj has a refcount of 2 because of its use in the dictionary */
       }
    }

PyDict_SetItem will bump the reference counts of the objects you pass into
it.  When the dictionary goes away, it does its DECREFs, but all those
integers still have non-zero reference counts as a result of their initial
creation by PyInt_FromLong.  You have to take care of that.

Skip





More information about the Python-list mailing list