删除DirectShow滤镜(析构函数未被调用)

3

我已经构建了一个自定义的DirectShow过滤器,实现了CSource。

class Myfilter : public CSource
{
   ~MyFilter(){ delete everything;}
}

当我在GraphStudio中使用这个过滤器时,我可以正确地删除它,析构函数也被正确调用。
当我通过COM实例化创建我的过滤器时,我不能再使用delete删除它。
IBaseFilter *pFilter = NULL;

HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, 
                              IID_PPV_ARGS(&pFilter));

如果删除pFilter,将不会调用析构函数。

我如何为我的过滤器调用自定义析构函数?

2个回答

4
您不应该删除COM对象,而应该使用Release()方法释放它们。当引用计数降至0时,CSource可能会将IUnknown::Release()实现为delete this。请注意保留HTML标记。

使用Release()代替delete来释放相同的内容。 - Eric
那么问题可能出现在其他地方。请发布一个最小化的示例以重现问题。 - André Caron
我仍然在某些地方引用了我的过滤器。主要是在我的图形构建类中,这些类并未被GraphStudio使用。 - Eric

0

如果您已将过滤器添加到图形中,请在释放自己的引用之前不要忘记从图形中删除它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接