首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从GetCurrentImage comtype访问DirectShow ()时DirectShow内存泄漏

从GetCurrentImage comtype访问DirectShow ()时DirectShow内存泄漏
EN

Stack Overflow用户
提问于 2013-04-24 14:17:32
回答 1查看 309关注 0票数 1

我必须调试内存泄漏的人的代码。它耗尽了所有的内存,然后最终崩溃(以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垃圾收集器,这是自切片饼以来最好的东西,如果您试图清除内存,您就会做错事。

这一行创建没有释放的内存:

代码语言:javascript
复制
lpDib = vmr_windowless_control.GetCurrentImage()

vmr_windowless_control来自于:

代码语言:javascript
复制
vmr_windowless_control = vmr_config.QueryInterface(IVMRWindowlessControl)

vmr_config来自:

代码语言:javascript
复制
vmr_config = self.filter.QueryInterface(IVMRFilterConfig)      
vmr_config.SetRenderingMode(Renderer.VMRMode[vmrmode]

IVMRFilterConfig来自COMtype DirectShowLib导入的地方:

代码语言:javascript
复制
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)

不知道该怎么对付这个,大脑被炸了。提前感谢您的帮助和引导。

EN

回答 1

Stack Overflow用户

发布于 2013-04-25 09:36:18

只需添加以下内容:

代码语言:javascript
复制
from ctypes import windll
windll.ole32.CoTaskMemFree(lpDib)

谢谢各位

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16194410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档