directshow 内存泄露

qwqwqw408 2010-02-05 11:19:51
void Mp3Player::Play()
{
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);
m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pIMediaEvent);

m_pGraph->RenderFile(fileName, NULL);
m_pIMediaEvent->WaitForCompletion(INFINITE,&evCode);
// 播放完毕,释放资源
m_pMediaControl->Stop();

SAFERELEASE(m_pGraph)
SAFERELEASE(m_pMediaControl)
SAFERELEASE(m_pIMediaEvent)
}

如上代码,初始化com库是在另外地方(构造函数里面),卸载则是在析构函数里。现在多次调用play方法,有很严重的内存泄露。用测试用例测试的时候,每调用一百次,内存减少几十到100多K。求ds方面的高人指点,万分感谢,分不多,这是全部分了,如果能解决问题,以后一定送分
...全文
175 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveisbug 2010-02-10
  • 打赏
  • 举报
回复
哦,我理解泄漏不是碎片。不知道楼主是否能确认是泄漏还是碎片。
luixing67 2010-02-10
  • 打赏
  • 举报
回复
一般new/delete都会产生内存碎片的
loveisbug 2010-02-10
  • 打赏
  • 举报
回复
有泄漏怎么会是正常的呢?
luixing67 2010-02-10
  • 打赏
  • 举报
回复
申请内存,再释放,有泄漏时正常的啊
qwqwqw408 2010-02-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 91program 的回复:]
建议LZ进行疲劳测试,看看会不会因为内存不足而出错.
如果是内存泄露,肯定会出错的.如果只是产生了内存碎片,则不会出错.

建议代码修改为:
void Mp3Player::Play()
{
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);
m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pIMediaEvent);

...

SAFERELEASE(m_pIMediaEvent)
SAFERELEASE(m_pMediaControl)
SAFERELEASE(m_pGraph)

}
[/Quote]

这个也测试过了,单是创建组件,然后马上释放,没有做任何操作,内存也还是不断减少。很奇怪
wolfmvp 2010-02-07
  • 打赏
  • 举报
回复
没弄过,学习学习。
91program 2010-02-06
  • 打赏
  • 举报
回复
建议LZ进行疲劳测试,看看会不会因为内存不足而出错.
如果是内存泄露,肯定会出错的.如果只是产生了内存碎片,则不会出错.

建议代码修改为:
void Mp3Player::Play()
{
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&m_pGraph);
m_pGraph->QueryInterface(IID_IMediaControl, (void **)&m_pMediaControl);
m_pGraph->QueryInterface(IID_IMediaEventEx, (void **)&m_pIMediaEvent);

...

SAFERELEASE(m_pIMediaEvent)
SAFERELEASE(m_pMediaControl)
SAFERELEASE(m_pGraph)

}
kyzf 2010-02-05
  • 打赏
  • 举报
回复
帮顶下。

MARK,学习下。
qwqwqw408 2010-02-05
  • 打赏
  • 举报
回复
调试的时候发现每次播放都会创建3个线程,完毕线程会退出。不知道内存泄露是否与创建线程有关,以前频繁的创建线程(创建的只是空线程,无任何执行代码)内存也会泄露,大小跟这差不多。

19,502

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧