我必须调试有内存泄漏的别人代码。它耗尽所有RAM然后最终崩溃(以4Mb / s的速率)。 我将其分离到一个电话,该电话抓取视频过滤器的屏幕截图并将其保存到名为 lbDib 的对象。但是之后Python不会释放它。我试过Del它,然后调用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)
不知道怎么攻击这个,大脑是炒的。提前感谢任何帮助或潜在客户。
答案 0 :(得分:0)
只需添加以下内容:
from ctypes import windll
windll.ole32.CoTaskMemFree(lpDib)
谢谢你们