У меня огромная проблема с утечкой памяти, связанная с разрабатываемым C-расширением. В C у меня есть массив значений типа double с именем A
и переменная int с именем AnotherIntVariable
, которую я хочу передать в Python. Ну, в моем модуле C-extension я делаю следующее:
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 (возможно, из-за мусора). коллекционер сделал свое дело) ...
... что мне здесь не хватает? Кто-нибудь может мне помочь?