Здравствуйте grad, Вы писали:
G>Пример из Д.Бокса
G>G>STDMETHODIMP GorillaClass::CreateInstance(IUnknown *pUnkOuter,
G> REFIID riid,
G> void** ppv)
G>{
G> *ppv = 0;
G>
G> if(pUnkOuter !=0)
G> return CLASS_E_NOAGGREGATION;
G> Gorilla* p = new Gorilla;
G>
G> if(p == 0)
G> return E_OUTOFMEMORY;
G> p->AddRef();
G> HRESULT hr = p->QueryInterface(riid, ppv);
G> p->Release();
G> return hr;
G>}
G>
утверждается (автором), что "этот прием использует стандартную технологию заключения в скобки AddRef/Release
G>вызова QueryInterface". Я не понимаю зачем это нужно в данном случае, по моему вызовы излишни.
G>Может ли кто-нибудь из присутствующих господ меня разубедить?
Я могу ошибаться, но возможно это сделано для автоматического удаления объекта, в случае если QueryInterface не пройдет.
После вызова new класс создается с нулевым счетчиком ссылок. AddRef увеличивает счетчик ссылок. Если QueryInterface не прошел, последующий Release обнулит счетчик ссылок и объект удалиться.