1

我必须调试有内存泄漏的其他人的代码。它耗尽了所有 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)

不知道如何攻击这个,大脑被炸了。提前感谢任何帮助或线索。

4

1 回答 1

0

只需要添加以下内容:

from ctypes import windll
windll.ole32.CoTaskMemFree(lpDib)

谢谢大家

于 2013-04-25T09:36:18.937 回答