我正在开发一款C扩展程序,但遇到了一个巨大的内存泄漏问题。我的C代码中有一个名为A
的double类型数组和一个名为AnotherIntVariable
的int变量,我想要将它们传递给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中,我会像这样接收列表和整数:
Pyt_A,Pyt_int=MyCModule.MyCFunction(...)
在我的C扩展模块"MyCModule
"中,我从函数"MyCFunction
"中获取到的列表和整数是Pyt_A
和Pyt_int
。问题是,在Python中,我使用这个Pyt_A
数组(所以我使用Py_BuildValue
而不是一个简单的return
语句,进行INCREF以便暂时保存这个变量,避免它被垃圾收集器清除),但是我需要以某种方式取消引用,以便释放已分配的内存。问题是,我多次使用MyCFunction
函数,这导致了内存泄漏,因为我不知道如何取消Python中获得的数组的引用,以摆脱它。
我尝试通过在代码的C部分执行return lst
,而不是Py_BuildValue("Oi",lst,AnotherIntVariable)
来返回数组,但是当我尝试在Python中使用它时,只会出现Segmentation Fault(可能是因为垃圾收集器起作用了)...
......我错过了什么?有人可以帮我吗?