当前位置: 代码迷 >> 多媒体/流媒体开发 >> x objects left active!解决方法
  详细解决方案

x objects left active!解决方法

热度:10626   发布时间:2013-02-26 00:00:00.0
x objects left active!!
    我自己写的一个Source Filter,在程序里构建Graph后,运行正常,但点退出的时候会退出ASSERT,
    Executable:xxx.exe Pid e3c Tid 7a4. Module xxx.ax, 3objects left active!
    At line 316 of .\dllentry.cpp

    查了些资料说可能是因为在代码里某些地方用AddRef增加了Filter的reference count, 但却没有release,导致Filter的reference count不为0, 其析构函数不会被调用。

    我的Filter继承了CSource类, 跟踪代码(->CBaseFilter->CUnknown)发现在CUnknown类里有一个protected成员 m_cref。

    然后我调试时发现,调用CoCreateInstance后m_cref变为了1,这可以理解,但是不能理解的是接下来调用pFilterGraph->AddFilter()添加Filter后m_cref又增1了,以及后面的ConnectFilter这些m_cref都增1,正常情况是应该像这样的吗?? 这样的话后面这个m_cref是不是就不能减到0了,就会产生上面的错误。

    大家有遇到过这种情况吗??
    Any suggestions are welcome.
------解决方案--------------------------------------------------------
看下com的AddRef和Release说明,哪些地方需要addref哪些需要release,有详细说明
------解决方案--------------------------------------------------------
tianma_25,您好!
    我没有遇到过这类错误。我查了下你的错误,看到http://blog.csdn.net/ljp2010/archive/2007/02/06/1503422.aspx里有人遇到,并解决。
    他说是因为你调用了pEnumFilter->Next,pFilter->QueryFilterInfo,pEnumPin->Next这一类方法,而DirectShow帮助文档中说明:“Note the places where the function calls Release on an interface to decrement the reference count.”,也就是说,每调用一次枚举,就需要手动去调用释放方法来减少参考数。可能你没有相对应的Release方法。你如果再遇到这类问题,就查查是不是哪地方没有配对的枚举与释放。
  相关解决方案