【发布时间】:2011-07-27 09:43:38
【问题描述】:
我有一个巨大的内存泄漏问题,涉及我正在开发的 C 扩展。在 C 语言中,我有一个名为 A 的双精度数组和一个名为 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 中我收到了这个列表和这样的 int:
Pyt_A,Pyt_int=MyCModule.MyCFunction(...)
其中 Pyt_A 和 Pyt_int 是我从 C 扩展“MyCModule”和我之前描述的函数“MyCFunction”得到的列表和整数。
问题是,在 Python 中,我使用这个 Pyt_A 数组(这就是为什么我使用 Py_BuildValue 而不是简单的 return 语句来执行 INCREF 以便暂时保存这个变量垃圾收集器)但是我需要以某种方式取消引用它以释放分配的内存。问题是我多次使用 MyCFunction 函数,这会产生内存泄漏,因为我不知道如何取消引用我在 python 中得到的数组以摆脱它。
我尝试通过在代码的 C 部分而不是 Py_BuildValue("Oi",lst,AnotherIntVariable) 中执行 return lst 来返回数组,但是当我尝试在 python 中使用它时只会导致分段错误(可能是因为垃圾收藏家做了他的工作)...
...我在这里错过了什么?有人可以帮帮我吗?
【问题讨论】:
-
在 python 中 del Pyt_A 不会 DECREF 数组并删除它吗?
-
我试过了,但它似乎不起作用。我仍然得到我所说的内存泄漏。
-
另外,你在 Py_BuildValue("Oi",lst,AnotherIntVariable) 之前确实有一个回报,对吧?
-
是的,我在帖子 editing 上错过了它
-
python 中的 sys.getrefcount(Pyt_A) 是什么?
标签: python c memory extension-methods memory-leaks