我声明了一个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接口,根据输入配置,我有该接口的两个实现(类)。我还有一个工厂方法,用于检查输入配置,并在...
WRL ComPtr
实例在您的]时刻自动增加参考计数器>
ComPtr