Re[4]: QueryInterface brasketing
От: aik Австралия  
Дата: 08.07.02 09:50
Оценка:
Здравствуйте Алекс, Вы писали:

А>Здравствуйте grad, Вы писали:


G>>Кажется понял. Если обобщить

G>>
p->>>AddRef(); 
G>>Function(p);\\любая ф-ция, которая может потенциально оставить внешнюю ссылку на p 
p->>>Release();
G>>
прием, который помогает избавиться от опасного delete p.


А>Ну не такой он и опасный. Автор вполне мог написать:

А>
А>HRESULT hr = p->QueryInterface(riid, ppv); 
А>if (FAILED(hr)) delete p;  
А>

А>но почему-то не написал
А>

Потому что, если ты занялся COM'ом, операторы new и (особенно!!!) delete — забудь. Нельзя делать delete на интерфейс (это просто ошибка, free ругнется на порченую память в большинстве случаев), да и не COM это уже будет. Также нельзя полагаться на значения, возвращаемые AddRef'ом и Release'ом, хочется — откажись от COM.
Автор сделал скобки для того, чтобы по выходу из QueryInterface (а на ее месте могло быть что угодно) указатель был все еще валидным, мало что там функция захочет сделать, может, она подчищает за собой лишние ссылки и может лишним релизом грохнуть объект.
И кто думает, что QI выдаст плохой HRESULT, если объект уже удален — наивны. Вернет мусор или шлепнется с исключением.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.