У меня огромная проблема с утечкой памяти, связанная с C-расширением, которое я разрабатываю. В C у меня есть массив двойников с именем A
и переменная типа int с именем AnotherIntVariable
, которую я хочу передать Python. Что ж, в моем модуле расширения C я делаю следующее:
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)
Итак, в Python я получаю этот список и int следующим образом:
Pyt_A,Pyt_int=MyCModule.MyCFunction(...)
Где Pyt_A и Pyt_int — это список и целое число, которое я получаю из моего C-расширения «MyCModule
» из функции «MyCFunction
», которую я описал ранее.
Проблема в том, что в Python я использую этот массив Pyt_A
(поэтому я использую Py_BuildValue
вместо простого оператора return
, чтобы сделать INCREF, чтобы на мгновение сохранить эту переменную из сборщика мусора), но затем мне нужно как-то разыменовать его, чтобы освободить выделенную память. Проблема в том, что я использую функцию MyCFunction
несколько раз, и это приводит к утечке памяти, потому что я не знаю, как разыменовать массив, который я получаю в python, чтобы избавиться от него.
Я попытался просто вернуть массив, выполнив return lst
в части кода C вместо Py_BuildValue("Oi",lst,AnotherIntVariable)
, но это приводит только к ошибке сегментации, когда я пытаюсь использовать его в python (вероятно, потому что сборщик мусора выполнил свою работу). .
... что мне здесь не хватает? Кто-нибудь может мне помочь?