Python:CTypes内存泄漏与结构

时间:2011-09-17 05:21:11

标签: python memory-leaks ctypes

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()

2 个答案:

答案 0 :(得分:2)

这不是内存泄漏,这只意味着垃圾收集器还没有运行。即使垃圾收集器确实运行,但是存在某种内存池的可能性很大。

ProcessExplorer不是一个好的调试工具,特别是对于内存。

答案 1 :(得分:1)

脚本本身并不会泄漏。使用gc.set_debug(gc.DEBUG_LEAK)运行表明创建的结构类型是可收集的,并且gc.garbage在每次循环迭代中都保持为空,因此没有无法收集的对象。在Linux系统上使用time运行脚本也不会显示内存消耗的稳定增长。