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

问题描述 投票:0回答:1

我声明了一个COM接口,根据输入配置,我有该接口的两个实现(类)。我也有一个工厂方法来检查输入配置,并在类上适当地调用NEW。在我的课堂上,我根据AddRef()规范实现了Release()COM。我声明一个ComPtr并调用factory方法来访问上述接口。我可以通过两种方式做到这一点,

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的引用计数为'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。

请指导我,为什么上述两种方法的引用计数不同,为什么返回对象会使引用计数递增(2),而Vs将对象指针设置为*ppv(引用计数1)。

可以预料,方法(1)导致内存泄漏,因为引用计数未变为0。

我声明了一个COM接口,根据输入配置,我有该接口的两个实现(类)。我还有一个工厂方法,用于检查输入配置,并在...

c++ com wrl
1个回答
0
投票

WRL ComPtr实例在您的]时刻自动增加参考计数器>

ComPtr

© www.soinside.com 2019 - 2024. All rights reserved.