Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当CComPtr作为类的成员变量时,如何销毁它?_C++_Com_Atl - Fatal编程技术网

C++ 当CComPtr作为类的成员变量时,如何销毁它?

C++ 当CComPtr作为类的成员变量时,如何销毁它?,c++,com,atl,C++,Com,Atl,当CComPtr作为类的成员变量时,如何销毁它 下面是我编写的一段代码,m_piControl是成员变量CComPtr。 我已将m_piControl的值分配给rpControl,并进一步使用rpControl HRESULT CSession::GetInterface(OUT CComPtr<IControl>& rpControl ) { if (m_piConSIControl == NULL) { CComPtr<IDisp

当CComPtr作为类的成员变量时,如何销毁它

下面是我编写的一段代码,m_piControl是成员变量CComPtr。 我已将m_piControl的值分配给rpControl,并进一步使用rpControl

HRESULT CSession::GetInterface(OUT CComPtr<IControl>&   rpControl )
{
    if (m_piConSIControl == NULL)
    {
        CComPtr<IDispatch> pConDM;
        HRESULT hResult = GetMaintenance( &pConDM );
        if( FAILED( hResult ) )
            return hResult;

        CComQIPtr<IMaintenance> pMaintenance( pConDM );
        if( !pMaintenance )
            return E_NOINTERFACE;

        hResult = pMaintenance->GetControl( &m_piControl );
        if( FAILED( hResult ) )
            return hResult;
    }
    rpControl = m_piControl;
    return S_OK;
}
HRESULT CSession::GetInterface(OUT-CComPtr&rpControl)
{
if(m_piConSIControl==NULL)
{
CComPtr pConDM;
HRESULT HRESULT=GetMaintenance(&pConDM);
如果(失败(hResult))
返回hResult;
CCOMKIPTR维护(pConDM);
如果(!pma维护)
返回E_NOINTERFACE;
hResult=pma维护->获取控制(&m_piControl);
如果(失败(hResult))
返回hResult;
}
rpControl=m_piControl;
返回S_OK;
}
分配时,m_piControl refcount增加。但是m_piControl的发布没有被调用。
我应该显式地调用它吗?

当[member]变量被销毁时,
m_piControl
的COM接口指针将被释放,这反过来又会随着所有者类实例的销毁而发生。这确实是“自动”发生的,并且引用计数得到了正确的管理。也就是说,您不需要显式地释放
mpicontrol
的值


如果出于任何原因仍然希望显式释放接口指针,则可以在任何时候(当然,前提是您遵守COM线程)调用
m_piControl.release()。例如,这可能发生在您在代码段中返回
S_OK
之前。

m_piControl在非空的情况下销毁其refcount时减少其refcount。因此,如果您在代码的其余部分正确地进行了处理,则无需在析构函数中递减。假设您希望在该函数完成后保持m_piControl。你成为会员是有原因的,对吧?是的。。我一次又一次地需要它。所以将其作为成员变量。我只是第一次创造它。但在返回时,所做的赋值正在增加其引用计数。它会引起任何问题吗?不会-当你把指针传给别人,而你无法控制生命时,这正是应该发生的事情。调用方的任务是在完成后释放它。有两个引用,一个由m_piControl变量保存,另一个由返回接口指针的客户端代码保存。发布您自己的引用是您的工作,客户端代码无法帮助您。参数不应该是CComPtr,这不是调用代码所使用的。它必须是一个普通的IControl**。谢谢您的评论。实际上,问题在于基类销毁。正确销毁基类后,ComPtr m_piControl将正确释放其refcount并自行销毁。