Re[6]: QueryInterface brasketing
От: aik Австралия  
Дата: 08.07.02 11:52
Оценка: -2
Здравствуйте Алекс, Вы писали:

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


А>Какой еще free. У меня ничего никогда не ругается. И при чем здесь AddRef и Release()?


Release и delete — взаимоисключающие операции в случае COM. delete вызывать нельзя, это убивает смысл COM'а как ориентированной на интерфейсы системы.
А ругаться будет crt, если объект держит 2 интерфейса и ты будешь делать delete по адресу второго интерфейса.

aik>>Автор сделал скобки для того, чтобы по выходу из QueryInterface (а на ее месте могло быть что угодно) указатель был все еще валидным, мало что там функция захочет сделать, может, она подчищает за собой лишние ссылки и может лишним релизом грохнуть объект.


А>QI ни при каких обстоятельствах не вызовет Release()! Это основы СОМ!


Примеры как раз и созданы для демонстрации общего подхода. QI не вызовет релиза, ежу понятно :)

aik>>И кто думает, что QI выдаст плохой HRESULT, если объект уже удален — наивны. Вернет мусор или шлепнется с исключением.

А>Так вернет мусор или шлепнется с исключением? Ты определись! Если p уже указывает на мусор она вообще не вызовется! Вообщем, братан, читай книжки, статьи
Автор(ы): Том Армстронг

В этой главе, позаимствованной из книги "ActiveX-Создание Web-приложений"
Тома Армстронга, рассматриваются основные понятия модели COM, такие как
интерфейс IUnknown, GUID, фабрики классов и т. д. Кроме того, автор приводит
примеры реализации COM-клиентов и COM-серверов с использованием языка C++,
Visual Basic и библиотеки ATL.
и все будет пучком!


p может указывать на только что освобожденную память из-под объекта или на память, похожую на объект. Мусор бывает разный.

Ты не о том говоришь. Я говорю о примере — зачем сделано так как сделано и почему нельзя вызывать delete на интерфейсе. Вы же все пытаетесь показать, что пример плохой и предлагаете корявые решения.
btw по ATL книжки читать плохо, MSDN — тоже, много ошибок. Лучше читать ATL'ные хидеры (atlbase и atlcom).

В общем, форумы здесь — шняга, не то, что статьи...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.