使用PyTuple_SetItem时出现内存泄漏
问题描述:
我正在C++ Python扩展中构建一组嵌套的元组。但是,我在管理引用计数方面遇到了一些问题。使用PyTuple_SetItem时出现内存泄漏
的最少的代码来重新创建此内存泄漏:
PyObject *outer = PyTuple_New(outer_size);
for (size_t index = 0; index < outer_size; ++index) {
PyObject *inner = Py_BuildValue("iiiiiiiiid", ...);
PyTuple_SetItem(outer, index, inner);
}
Py_CLEAR(outer);
Py_INCREF(Py_None);
return Py_None;
现在,如果我不是一个Py_CLEAR(inner)
更换PyTuple_SetItem(outer, index, inner)
,内存使用量不会随时间而增长。
我错了有关外元组偷参考内部的元组?有没有其他原因记忆不会被回收?
答
原来,我错误地认为内存泄漏的缓慢增长的内存使用(出于其他原因)。如果参考计数失败了,它会大幅增长。所以,这是真的。此代码不会泄漏。
+0
如果这有点令人困惑......代码返回在图像中检测到的一组窗口。事实证明,我使用的图像列表恰好在每个图像中有更多的窗口,因此随着时间的推移会使用更多的内存。 – squidpickles 2012-03-06 00:37:59
代码应不漏气。我想补充称吃着检查每个API函数的返回值并显示的代码背后隐藏了'...'。 – sterin 2012-03-03 04:32:56