引自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;
}
答案 0 :(得分:2)
1.在下面的代码中调用pDocument-> Release()后,@ rc变量等于1。我应该为pDocument两次调用Release吗?
没有。这意味着其他人也拥有对这个对象的引用,如果你让对象从它们下面删除它们,它们就不会被逗乐。
2.在哪些情况下,IDispatch的refence计数会增加?
当你在它上面或者在引用同一个对象的任何其他界面指针上调用AddRef
时。
3.当我将IDispatch作为指针传递给我的函数时,IDispatch的引用计数会增加吗?
不,不是自动的。当然,该函数对AddRef
是免费的,如果需要将指针存储在某处,则可以这样做,以便在函数返回后使用它。
4.我有几十个IDispatch *对象,那么如果我忘记Release()中的任何一个呢?内存泄漏?
是。当您忘记free
某事malloc
或delete
某事new
或fclose
某事时,会发生同样的事情你fopen
编辑了
5.是否有任何简单的方法可以释放所有IDispatch *或者我必须手动释放它们?
查看智能指针,例如CComPtr
或_com_ptr_t
。