为什么 QueryInterface()
调用总是跟在 Release()
调用之后?例如,我在 MSDN 上看到了如下示例代码:
HRESULT hr = S_OK;
CDecoder *pObj = new CDecoder(&hr);
if (SUCCEEDED(hr))
{
*ppv = NULL;
hr = pObj->QueryInterface(riid, ppv);
}
pObj->Release();
return hr;
有人可以在这里解释 Release()
调用背后的意图吗?
最佳答案
虽然这很常见,但并不总是像这样直接跟随。
COM 对象是引用计数的。当您最初创建该对象时,您会得到一个指向 IUnknown
的指针。然后,您可以使用 QueryInterface
获得其他一些接口(interface)。由于您(通常)不再关心 IUnknown
接口(interface),您可以释放它。当您释放您获得的另一个接口(interface)时,引用计数将为 0,因此该对象可以被销毁。但是,如果您不释放 IUnknown
,引用计数将保持非零,因此无法销毁该对象。
您不会立即释放IUnknown
的最明显的情况是当/如果您需要获得多个其他接口(interface)。在这种情况下,您将获得 IUnknown
,然后是第二个和第三个接口(interface),然后释放 IUnknown
。至少在某些情况下,您可能在创建对象后不知道第三个(或后续的)接口(interface),因此您可能需要在任意时间之前保留对 IUnknown
的访问权限释放它。
关于c++ - 为什么每次成功的 QueryInterface() 调用之后都是 Release() 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5047689/