Re: QueryInterface brasketing
От: Аноним  
Дата: 04.07.02 13:56
Оценка:
Здравствуйте 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 обнулит счетчик ссылок и объект удалиться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.