【发布时间】:2014-11-03 16:00:53
【问题描述】:
我有一个 python 模块,它调用一个用 C 语言编写的 DLL 来编码 XML 字符串。一旦函数返回编码字符串,它就无法解除在此步骤中分配的内存。具体来说:
encodeMyString = ctypes.create_string_buffer(4096)
CallEncodingFuncInDLL(encodeMyString, InputXML)
我查看了this、this 和this 并尝试调用gc.collect,但也许由于该对象已在外部 DLL 中分配,python gc 没有任何记录它并且无法删除它。但由于代码不断调用编码函数,它不断分配内存,最终python进程崩溃。有没有办法分析这种内存使用情况?
【问题讨论】:
-
Python 无法跟踪它不知道的外部事物分配的内存;你必须手动完成。大概 DLL 有一个
ReleaseThingEncodedByDLL函数。你必须这样称呼。将其中的值复制到适当的本机 Python 对象并立即释放它,或者将其包装在一个对象中,然后在close或__exit__或__del__或任何适当的地方释放它。 -
@abarnert,但是 python 的进程本身正在跟踪这个内存,它只是无法删除它。这怎么可能?
-
你是什么意思“python的进程本身正在跟踪这个内存”?如果您的意思是它在 python 进程的堆中……是的,当然是,DLL 是进程的一部分,并加载到它的堆中。这并不意味着 Python 可以跟踪 DLL 分配的任何内存,更不用说知道该 DLL 何时使用它。
标签: python c memory memory-leaks