使用PyTuple_SetItem时明显的内存泄漏

时间:2012-03-01 01:11:57

标签: reference-counting python-c-api python-c-extension

我正在C ++ Python扩展中构建一组嵌套的元组。但是,我在管理引用计数方面遇到了一些问题。

重新创建此内存泄漏的最小代码:

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;

现在,如果我将PyTuple_SetItem(outer, index, inner)替换为Py_CLEAR(inner),则内存使用量不会随着时间的推移而增长。

外部元组窃取内部元组的引用我错了吗?是否有其他原因记忆不会被回收?

1 个答案:

答案 0 :(得分:1)

事实证明,我错误地将内存使用(由于其他原因)用于内存泄漏非常缓慢增长。如果引用计数失败,它的增长速度会快得多。所以,这是真的。此代码不会泄漏。