I have a huge memory leak problem involving a C-extension I'm developing. In C, I have an array of doubles called A
and an int variable called AnotherIntVariable
that I want to pass to Python. Well, in my C-extension module I do the following:
int i;
PyObject *lst = PyList_New(len_A);
PyObject *num;
if(!lst)
return NULL;
for(i=0;i<len_A;i++){
num=PyFloat_FromDouble(A[i]);
if(!num){
Py_DECREF(lst);
return NuLL;
}
PyList_SET_ITEM(lst,i,num);
}
free(A);
return Py_BuildValue("Oi",lst,AnotherIntVariable)
So in Python i recieve this list and the int like this:
Pyt_A,Pyt_int=MyCModule.MyCFunction(...)
Where Pyt_A and Pyt_int are the list and the integer I get from my C-extension "MyCModule
", from the function "MyCFunction
" that I described earlier.
The problem is that, in Python, I use this Pyt_A
array (so that's why I use Py_BuildValue
instead of a simple return
statement, to do an INCREF in order to save this variable for a moment from the garbage collector) but then I need to dereference it somehow in order to free that allocated memory. The problem is that I use the MyCFunction
function several times, and this produces a memory leakage because I don't know how to dereference the array that I get in python in order to get rid of it.
I tried just returning the array by doing a return lst
in the C part of the code instead of the Py_BuildValue("Oi",lst,AnotherIntVariable)
, but that only results in a Segmentation Fault when I try to use it in python (probably because the garbage collector did his work)...
...what am I missing here? Can anybody help me?