从工厂方法返回的ComPtr的引用计数增加两次

Reference count of ComPtr returned from a factory method is incremented twice

本文关键字:增加 两次 方法 工厂 返回 ComPtr 引用      更新时间:2023-10-16

我声明了一个COM接口,根据输入配置,我有两个接口的实现(类(。我还有一个工厂方法,它检查输入配置并在类上适当地调用NEW。在我的类中,我按照COM规范实现了AddRef()Release()。我声明了一个ComPtr,并调用工厂方法来访问上面的接口。我可以用两种方法,

1( 从工厂方法返回ComPtr

ComPtr<ICaptureSource> ICaptureSource::CreateInstance(someConfig)
{
switch (someConfig)
{
case 1:
return (new CCaptureSource1());  >> Ref count in this class is initialized to 1 
break;
case 2:
return (new CCaptureSource2());  >> Ref count in this class is initialized to 1 
break;
default:
return nullptr;
}
}

ComPtr <ICaptureSource> captureSource;
captureSource = ICaptureSource::CreateInstance(someConfig);

从上述调用返回后,captureSource的Ref计数为"2"。我本来以为是1。

然而,对于以下代码,参考计数为1

2( 将ComPtr地址作为参数传递给工厂方法

HRESULT ICaptureSource::CreateInstance(someConfig, ICapturesource **ppv)
{
ICaptureSource *pTemp = nullptr;
switch (someConfig)
{
case 1:
pTemp = new CCaptureSource1();  >> Ref count in this class is initialized to 1 
break;
case 2:
pTemp = new CCaptureSource2();  >> Ref count in this class is initialized to 1 
break;
}
if (SUCCEEDED(hr) && (ppv != nullptr))
{
*ppv = pTemp;
}
return hr
}

ComPtr <ICaptureSource> captureSource;
hr = ICaptureSource::CreateInstance(someConfig, &captureSource);

captureSource引用计数现在为1。

请指导我,为什么以上两种方法中的ref计数存在差异,以及为什么返回对象是递增ref计数(2(,而不是将对象指针设置为*ppv(ref计数1(。

不出所料,方法(1(导致memleak,因为ref计数没有变为0。

WRLComPtr实例在时自动递增参考计数器

new CCaptureSource1()

转换为返回的

ComPtr<ICaptureSource>

这是设计和记录的行为("…自动维护底层接口指针的引用计数…"(。当captureSource变量超出范围时,对象上的引用计数将递减。

在第二种方法中,您将一个原始接口指针附加到ComPtr实例中:将一个raw(意思是:不按智能指针类递增(指针放置到*ppv中,以便引用计数器保持为1。ComPtr实例将在不增加指针的情况下附加指针,但在销毁时会减少指针。这就是参考计数器达到零的方式。