如果将 COM 接口的指针分配给 CComPtr 对象,我是否需要释放原始接口?
If pointer of a COM interface assigned to a CComPtr object do I need to Release the original one?
如果我创建任何 COM 接口的指针,然后将其分配给同一 COM 接口的 CComPtr
对象,我是否需要释放原始 COM 指针?
ISomeComInterface* pSomeComInterface = new CSomeComInterfaceImplemented();
CComPtr<ISomeComInterface> cptrSomeComInterface = pSomeComInterface;
// ....
// Do I need to Release original COM Pointer.
pSomeComInterface->Release();
是的,您可能需要释放之前的指针;
CComPtr::operator =
This operation AddRefs the new object and releases the existing object, if one exists.
来自 MSDN。 CComPtr
用于管理 COM 对象的生命周期(它将 RAII 习惯用法应用于 COM 对象)——它管理引用计数本身。
但是,您用来创建 COM 对象的技术很不寻常,它似乎没有执行 AddRef()
;因此在这种情况下,不需要 Release()
。
用CComPtr
创建COM对象的常用方法是使用CComPtr
的CoCreateInstance
方法。在这种情况下,AddRef()
和 Release()
方法由 CComPtr
管理,不应由您的客户端代码调用。
CComPtr
负责其内部接口指针的引用计数,由 class 的实例管理。它对其他指针的引用计数没有影响。也就是说,将指针分配给变量后,您可以确定 CComPtr
的内部指针是 AddRef
'd 和 Release
',但您应该注意您自己的原始接口指针变量 pSomeComInterface
并进行显式 Release
调用。
这取决于 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;
}
如果我创建任何 COM 接口的指针,然后将其分配给同一 COM 接口的 CComPtr
对象,我是否需要释放原始 COM 指针?
ISomeComInterface* pSomeComInterface = new CSomeComInterfaceImplemented();
CComPtr<ISomeComInterface> cptrSomeComInterface = pSomeComInterface;
// ....
// Do I need to Release original COM Pointer.
pSomeComInterface->Release();
是的,您可能需要释放之前的指针;
CComPtr::operator =
This operation AddRefs the new object and releases the existing object, if one exists.
来自 MSDN。 CComPtr
用于管理 COM 对象的生命周期(它将 RAII 习惯用法应用于 COM 对象)——它管理引用计数本身。
但是,您用来创建 COM 对象的技术很不寻常,它似乎没有执行 AddRef()
;因此在这种情况下,不需要 Release()
。
用CComPtr
创建COM对象的常用方法是使用CComPtr
的CoCreateInstance
方法。在这种情况下,AddRef()
和 Release()
方法由 CComPtr
管理,不应由您的客户端代码调用。
CComPtr
负责其内部接口指针的引用计数,由 class 的实例管理。它对其他指针的引用计数没有影响。也就是说,将指针分配给变量后,您可以确定 CComPtr
的内部指针是 AddRef
'd 和 Release
',但您应该注意您自己的原始接口指针变量 pSomeComInterface
并进行显式 Release
调用。
这取决于 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;
}