У нас есть устаревший программный код, который использует COM.Я заметил, что в одном месте мы выполняем queryInterface для IInspectable указателя, но не беспокоимся о вызове 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;
Но я вижу, что приведенный выше код иногда дает сбой в вышеуказанной функции во время выпуска.Что-то не так в том, как я выпускаю интерфейс?Я могу подтвердить, что myInterface не используется где-либо еще в функции после оператора Release.
Извинения за невозможность скопировать / вставить фактический код, но приведенный выше код суммирует в значительной степени подозрительный код, который яотлаживаю.По сути, я хочу знать, нужно ли в приведенном выше сценарии вызывать Release ()?И это правильное место / способ вызова Release ()?Нужно ли добавлять какие-либо другие проверки безопасности на месте?