1

引用 IUnknown->Release() 文档:“调用者注意事项当您不再需要使用接口指针时调用此方法。如果您正在编写一个采用 in-out 参数的方法,请在您传递的指针上调用 Release在将输出值复制到它上面之前。”

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

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

3.当我将 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;
}
4

1 回答 1

3

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

不,这意味着其他人也持有对这个对象的引用,如果你让对象从他们下面删除自己,他们不会觉得好笑。

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

当您调用AddRef它或引用同一对象的任何其他接口指针时。

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

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

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

是的。当你忘记你已经编辑过的free东西malloc,或者delete你已经new编辑过的fclose东西,或者你已经编辑过的东西时,也会发生同样的事情fopen

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

查看智能指针,例如CComPtror _com_ptr_t

于 2013-10-22T21:23:17.720 回答