Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:CTypes结构内存泄漏_Python_Memory Leaks_Ctypes - Fatal编程技术网

Python:CTypes结构内存泄漏

Python:CTypes结构内存泄漏,python,memory-leaks,ctypes,Python,Memory Leaks,Ctypes,Pythonctypes是否存在已知的内存泄漏?我正在使用ctypes,编写一个Python脚本,该脚本包含如下代码片段,由于某种原因导致内存泄漏。本例中的“while True”用于测试调用函数所导致的泄漏。它使用Python 2.5.4在Windows上运行: import ctypes def hi(): class c1(ctypes.Structure): _fields_=[('f1',ctypes.c_uint8)] class c2(cty

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不断占用越来越多的内存。它似乎需要有两个结构子类,其中一个类有另一个的“倍数”(使用
*
操作符),但我不确定条件是否比这更基本。即使在循环中添加了
deltest
,它仍然会泄漏内存

你知道是什么引起的吗

编辑:因为有人建议它可能还没有垃圾收集,所以这里有一个经过编辑的版本,它确实进行垃圾收集,但仍然会泄漏内存:

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

这不是内存泄漏,只是意味着垃圾收集器还没有运行。即使垃圾收集器确实运行了,也有可能出现某种内存池


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

中的脚本本身不会泄漏。使用
gc.set\u debug(gc.debug\u LEAK)
运行表明创建的结构类型是可收集的,并且
gc.garbage
在每个循环迭代中保持为空,因此没有不可收集的对象。在Linux系统上使用
时间运行脚本
也不会显示内存消耗的稳步增加。

即使我在开始时添加了“import gc”并在循环中添加了“test2=gc.collect()”,它占用的内存仍在不断增长。你说的“内存池”是什么意思?内存不应该在某个时候释放吗?内存池意味着(在python中)留出一个区域来存放空闲内存。这是一种优化技术。看起来只是内存被占用了。它泄漏了多少?创建的每个
c1
是否有一个字节?有一个计数器,它每50000次调用
hi()
打印一次,大概你知道的。在ProcessExplorer中,“工作集”内存每秒稳定地增加20-30KB,每隔一段时间,“专用字节”就会达到这个值。大约12分钟后,我的内存已经超过59MB,正在计算解释器中运行的第二个代码段。如何在代码中放置一个计数器,告诉您占用了多少内存?其他人能证实我的这一点吗?最简单的方法是将
从itertools导入计数添加到顶部,然后将
更改为
,而True:
为计数中的c():
,然后添加
如果不是c%50000:在循环中打印c
。然后,如果打印的
太频繁或太少而没有用处,则增加或减少
50000
;以下是交叉引用:正如你从对该案件的回复中所看到的,这不是一个漏洞。您确实不应该尝试将process explorer用作泄漏检测工具。