我必须调试内存泄漏的人的代码。它耗尽了所有的内存,然后最终崩溃(以4MB/s的速度)。我将其隔离为一个调用,该调用获取视频过滤器的屏幕截图,并将其保存到名为lbDib的对象中。但是Python在使用之后并没有释放它。我尝试过执行它,然后调用gc.collect()。我把它分配给零或零,等等,但是内存没有被释放。
在谷歌上搜索了一下之后,我发现:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd390556%28v=vs.85%29.aspx
其中指出:
VMR为图像分配内存,并在lpDib变量中返回指向它的指针。调用方必须通过调用CoTaskMemFree来释放内存。
当我研究内存管理时,我只是不断地遇到python垃圾收集器,这是自切片饼以来最好的东西,如果您试图清除内存,您就会做错事。
这一行创建没有释放的内存:
lpDib = vmr_windowless_control.GetCurrentImage()vmr_windowless_control来自于:
vmr_windowless_control = vmr_config.QueryInterface(IVMRWindowlessControl)vmr_config来自:
vmr_config = self.filter.QueryInterface(IVMRFilterConfig)
vmr_config.SetRenderingMode(Renderer.VMRMode[vmrmode]IVMRFilterConfig来自COMtype DirectShowLib导入的地方:
try:
from comtypes.gen.DirectShowLib import (ICreateDevEnum, IBaseFilter, IBindCtx,
IMoniker, IFilterGraph,
IVMRFilterConfig,
IVMRWindowlessControl, IAMCrossbar,
IAMTVTuner, IAMStreamConfig,
IAMVideoProcAmp, IFilterMapper2)
except ImportError:
GetModule("DirectShow.tlb") # Create gen.DirectShowLib if it doesn't exist
from comtypes.gen.DirectShowLib import (ICreateDevEnum, IBaseFilter, IBindCtx,
IMoniker, IFilterGraph,
IVMRFilterConfig,
IVMRWindowlessControl, IAMCrossbar,
IAMTVTuner, IAMStreamConfig,
IAMVideoProcAmp, IFilterMapper2)不知道该怎么对付这个,大脑被炸了。提前感谢您的帮助和引导。
发布于 2013-04-25 09:36:18
只需添加以下内容:
from ctypes import windll
windll.ole32.CoTaskMemFree(lpDib)谢谢各位
https://stackoverflow.com/questions/16194410
复制相似问题