我们有一些使用 COM 的遗留软件代码。我注意到在一个地方,我们在 IInspectable 指针上执行 queryInterface,但不打扰调用 release。
例如:
void foo(IInspectable* myInterface)
{
ComPtr<OBJTYPE> pObj;
auto hr = myInterface->QueryInterface(__uuidof(SomeType),&pObj);
if (hr != S_OK)
{
return hr;
}
//some code that uses pObj
}
我在上面的代码中添加了 Release,如下所示:
auto hr = myInterface->QueryInterface(__uuidof(SomeType),&pObj);
if (hr != S_OK)
{
return hr;
}
myInterface->Release(); //<-- Is this the correct way to release ?
//some code that uses pObj;
但是我看到上面的代码在发布期间有时会在上面的函数中崩溃。我发布界面的方式有问题吗?我可以确认在 Release 语句之后,函数中的其他任何地方都没有使用 myInterface。
抱歉无法复制/粘贴实际代码,但上面的代码几乎总结了我正在调试的可疑代码。基本上我想知道的是,在上述情况下,我需要调用 Release() 吗?这是调用 Release() 的正确位置/方式吗?我是否需要添加任何其他安全检查?