从工厂方法返回的ComPtr的引用计数增加两次
Reference count of ComPtr returned from a factory method is incremented twice
我声明了一个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
实例将在不增加指针的情况下附加指针,但在销毁时会减少指针。这就是参考计数器达到零的方式。
相关文章:
- g++的分段错误(在NaN上使用to_string两次时)
- 蛇在C++不会连续转两次
- 检查一个数组是否包含在另一个数组中,以相反的顺序,至少两次
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 我应该如何去缓解两次出现的cin?
- Realloc 两次无法在 Visual Studio 上运行
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)
- 为什么映射插入和 map.find() 的单次迭代比插入和 map.find() 的两次单独迭代慢得多
- C++析构函数调用两次,堆栈分配的复合对象
- 为什么参数在构造 std::thread 时移动两次
- Qt插槽调用了两次
- 做 std::用相同的unique_ptr移动两次
- C++两次定义相同的函数会导致错误
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 使用柯南打包时如何避免列出两次依赖?
- 为什么要执行两次位移((x >> 4)<< 4)?
- 对结构向量进行两次排序
- 如果我使用同一个密钥推送用户数据两次,会发生什么
- 从工厂方法返回的ComPtr的引用计数增加两次