释放IDispatch指针

时间:2013-10-22 21:13:36

标签: visual-c++ com ole

引自IUnknown-> Release()文档: “来电者注意事项 不再需要使用接口指针时调用此方法。如果您正在编写一个带有in-out参数的方法,请在复制其上方的out-value之前调用您传入的指针上的Release。“

1.在下面的代码中调用pDocument-> Release()后,@ rc变量等于1。我应该为pDocument两次调用Release吗?

2.在哪些情况下,IDispatch的refence计数会增加?

3.当我将IDispatch作为指针传递给我的函数时,IDispatch的引用计数会增加吗?

4.我有几十个IDispatch *对象,那么如果我忘记Release()中的任何一个呢?内存泄漏?

5.是否有任何简单的方法可以释放所有IDispatch *或者我必须手动释放它们?

AutoWrap(DISPATCH_METHOD, &result.GetVARIANT(), pDocuments, TEXT("Close"), 1, saveChanges.GetVARIANT());

AutoWrap(DISPATCH_METHOD, &result.GetVARIANT(), pWApp, TEXT("Quit"), 0);

//Finalizing
if (pWApp)
{
    pWApp->Release();
    pWApp = NULL;
}
if (pDocuments)
{
    ULONG rc = pDocuments->Release();
    pDocuments = NULL;
}
if (pActiveDocument)
{
    pActiveDocument->Release();
    pActiveDocument = NULL;
}

1 个答案:

答案 0 :(得分:2)

  

1.在下面的代码中调用pDocument-> Release()后,@ rc变量等于1。我应该为pDocument两次调用Release吗?

没有。这意味着其他人也拥有对这个对象的引用,如果你让对象从它们下面删除它们,它们就不会被逗乐。

  

2.在哪些情况下,IDispatch的refence计数会增加?

当你在它上面或者在引用同一个对象的任何其他界面指针上调用AddRef时。

  

3.当我将IDispatch作为指针传递给我的函数时,IDispatch的引用计数会增加吗?

不,不是自动的。当然,该函数对AddRef是免费的,如果需要将指针存储在某处,则可以这样做,以便在函数返回后使用它。

  

4.我有几十个IDispatch *对象,那么如果我忘记Release()中的任何一个呢?内存泄漏?

是。当您忘记free某事mallocdelete某事newfclose某事时,会发生同样的事情你fopen编辑了

  

5.是否有任何简单的方法可以释放所有IDispatch *或者我必须手动释放它们?

查看智能指针,例如CComPtr_com_ptr_t