我必须调试有内存泄漏的其他人的代码。它耗尽了所有 RAM,然后最终崩溃(以 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)
不知道如何攻击这个,大脑被炸了。提前感谢任何帮助或线索。