Python ctypes
是否有已知的内存泄漏?我正在使用ctypes
编写类似下面代码段的Python脚本,由于某种原因导致内存泄漏。此示例中的“while True
”用于测试调用该函数导致的泄漏。它使用Python 2.5.4在Windows上运行:
import ctypes
def hi():
class c1(ctypes.Structure):
_fields_=[('f1',ctypes.c_uint8)]
class c2(ctypes.Structure):
_fields_=[('g1',c1*2)]
while True:
test=hi()
可以使用ProcessExplorer测试泄漏 - 因为它不断循环,Python不断占用越来越多的内存。它似乎需要有两个Structure子类,其中一个类具有另一个的“倍数”(使用*
运算符),但我不确定条件是否比这更基本。即使在循环中添加了del test
,它仍然会泄漏内存。
关于可能导致此问题的任何想法?
编辑:因为有人建议它可能没有垃圾收集,这里是一个编辑版本,它做垃圾收集,但似乎仍然泄漏内存:
import gc
import ctypes
def hi():
class c1(ctypes.Structure):
_fields_=[('f1',ctypes.c_uint8)]
class c2(ctypes.Structure):
_fields_=[('g1',c1*2)]
while True:
test=hi()
test2=gc.collect()
答案 0 :(得分:2)
这不是内存泄漏,这只意味着垃圾收集器还没有运行。即使垃圾收集器确实运行,但是存在某种内存池的可能性很大。
ProcessExplorer不是一个好的调试工具,特别是对于内存。
答案 1 :(得分:1)
脚本本身并不会泄漏。使用gc.set_debug(gc.DEBUG_LEAK)
运行表明创建的结构类型是可收集的,并且gc.garbage
在每次循环迭代中都保持为空,因此没有无法收集的对象。在Linux系统上使用time
运行脚本也不会显示内存消耗的稳定增长。