我使用 Python C API 反复调用我用 C++ 编写的 Python 模块。我的 python 程序反复调用我的模块的pyParse
函数,该函数做了很多事情并返回PyTuple
包含更多PyTuple
对象作为元素的 a。每个返回的对象都以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 对象不断增长。
然而,因为每个返回的对象都有 1 作为引用计数,所以我希望它在超出 python 的范围后会被销毁。最后,我的程序在read access violation
代码的随机部分结束。有什么我想念的吗?或者有谁知道如何调试这个并更好地处理正在发生的事情?我很绝望!