【发布时间】:2012-03-01 01:11:57
【问题描述】:
我正在 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),内存使用量不会随时间增长。
关于外部元组窃取对内部元组的引用,我错了吗?是否有其他原因无法回收内存?
【问题讨论】:
-
代码不应该泄露。我会随意添加断言来检查每个 API 函数的返回值,并显示隐藏在
...后面的代码。
标签: reference-counting python-c-api python-c-extension