如果分配给CComPtr对象的COM接口的指针是否需要释放原始对象?

时间:2015-07-23 12:25:18

标签: c++ com atl

如果我创建任何COM接口的指针,然后将其分配给同一COM接口的CComPtr对象,我是否需要释放原始COM指针?

ISomeComInterface* pSomeComInterface = new CSomeComInterfaceImplemented();
CComPtr<ISomeComInterface> cptrSomeComInterface = pSomeComInterface;

// ....
// Do I need to Release original COM Pointer.
pSomeComInterface->Release();

3 个答案:

答案 0 :(得分:4)

是的,您可能需要释放上一个指针;

  

CComPtr::operator =

     

此操作AddRefs新对象并释放现有对象(如果存在)。

来自MSDNCComPtr用于管理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;
}