如果我创建任何COM接口的指针,然后将其分配给同一COM接口的CComPtr
对象,我是否需要释放原始COM指针?
ISomeComInterface* pSomeComInterface = new CSomeComInterfaceImplemented();
CComPtr<ISomeComInterface> cptrSomeComInterface = pSomeComInterface;
// ....
// Do I need to Release original COM Pointer.
pSomeComInterface->Release();
答案 0 :(得分:4)
是的,您可能需要释放上一个指针;
CComPtr::operator =
此操作AddRefs新对象并释放现有对象(如果存在)。
来自MSDN。 CComPtr
用于管理COM对象的生命周期(它将RAII惯用法应用于COM对象) - 它自己管理引用计数。
但是,您用于创建COM对象的技术是不寻常的,它似乎不执行AddRef()
;因此在这种情况下,不需要Release()
。
使用CComPtr
创建COM对象的常用方法是使用CComPtr
的{{3}}方法。在这种情况下,AddRef()
和Release()
方法由CComPtr
管理,不应由您的客户端代码调用。
答案 1 :(得分:2)
CComPtr
负责其内部接口指针的引用计数,由类的实例管理。它对其他指针的引用计数没有影响。也就是说,在指定了变量的指针之后,您可以确保CComPtr
的内部指针是AddRef
&#39; ded和Release
&#39; d必要时,您应该自己处理原始接口指针变量pSomeComInterface
并进行显式Release
调用。
答案 2 :(得分:1)
这取决于COM对象构造函数如何初始化引用计数。最有可能的是它将其设置为零,因此您不需要额外的Release()
调用。然后CComPtr
将处理该对象。
查看COM对象如何初始化引用计数以确定。将引用计数设置为零以外的任何内容都是非法的,唯一的要求是一旦将对象指针返回到COM客户端,引用计数就会设置为1,所有权就会传递给客户端。严格来说,因为您new
对象而不是调用CoCreateInstance()
或调用COM对象的方法,所以不能保证任何特定值。
因此,如果在对象构造函数中将引用计数设置为1,则以下可能是合法的:
HRESULT ComMethod( Type** result )
{
if( result == 0 ) {
return E_POINTER;
}
//refcount set to 1 in constructor,
//so no AddRef() call
*result = new Type();
return S_OK;
}