У меня проблема с утечкой памяти, связанная с расширением C, которое я разрабатываю. В C у меня есть массив удвоений, называемый A
, и переменная int, называемая AnotherIntVariable
, которую я хочу передать Python. Ну, в моем модуле C-расширения я делаю следующее:C-extension в Python - возвращает проблему с утечкой памяти Py_BuildValue()
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)
, но это только приводит к Segmentation Fault при попытке использовать его в питон (вероятно, потому что сборщик мусора сделал его работа) ...
... что я здесь не хватает? Кто-нибудь может мне помочь?
не del Pyt_A в python DECREF массива и удалить его? – highBandWidth
Я попробовал, но он, похоже, не работает. Я все еще получаю эту утечку памяти, о которой я говорю. –
Кроме того, у вас есть возврат до Py_BuildValue («Oi», lst, AnotherIntVariable) правильно? – highBandWidth