2012-03-01 50 views
1

我正在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

代码应不漏气。我想补充称吃着检查每个API函数的返回值并显示的代码背后隐藏了'...'。 – sterin 2012-03-03 04:32:56

回答

1

原来,我错误地认为内存泄漏的缓慢增长的内存使用(出于其他原因)。如果参考计数失败了,它会大幅增长。所以,这是真的。此代码不会泄漏。

+0

如果这有点令人困惑......代码返回在图像中检测到的一组窗口。事实证明,我使用的图像列表恰好在每个图像中有更多的窗口,因此随着时间的推移会使用更多的内存。 – squidpickles 2012-03-06 00:37:59