【问题标题】:Apparent memory leak when using PyTuple_SetItem使用 PyTuple_SetItem 时出现明显的内存泄漏
【发布时间】: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


【解决方案1】:

原来我误认为内存使用量增长非常缓慢(出于其他原因)是内存泄漏。如果引用计数失败,它会增长得更快。所以,这是真的。此代码不会泄漏。

【讨论】:

  • 如果这有点令人困惑......代码返回了一组在图像中检测到的窗口。事实证明,我使用的图像列表恰好在每个图像中都有更多的窗口,因此随着时间的推移会使用更多的内存。
猜你喜欢
  • 1970-01-01
  • 2013-11-09
  • 2013-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
相关资源
最近更新 更多