Python C扩展 - 在返回的PyObjects上,尽管Refcount = 1,内存泄漏

时间:2016-06-03 21:20:00

标签: dynamic-memory-allocation python-c-api reference-counting python-c-extension pyobject

我反复使用Python C API调用我在C ++中编写的python模块。我的python程序反复调用我的模块的pyParse函数,该函数执行大量的操作并返回包含更多PyTuple个对象作为元素的PyTuple。每个返回的对象最终都以PyObject->refcnt为1,因此您知道该对象在python中超出范围时应该被删除。我反复使用类似下面的python代码调用此模块:

import my_module #this is my c++ module.
import os
path = 'C:/data/'
for filename in os.listdir(path):
    data = my_module.pyParse(path+filename)

此循环运行的时间越长,内存使用量就会越大。每次迭代都会产生大约2kb的元组(应该在每次迭代结束时销毁)。然而,当我使用“堆快照”并稍后比较早期的多次迭代时,您可以看到PyTuple_New调用的内存分配和其他python对象不断增长。

There appears to be a memory leak associated with every PyObject, such as PyTuple_New

然而,因为每个返回的对象都有1作为引用计数,我希望它在python中超出范围后会被销毁。最后,我的程序以代码的随机部分read access violation结束。有什么我想念的吗?或者有没有人知道如何调试这个并更好地处理正在发生的事情?我很绝望!

0 个答案:

没有答案