![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Заметил, что объекты DirectShow (и, наверное, все объекты COM), надо создавать на хипе при помощи new, а уничтожать при помощи delete не надо.
Как они так сделали? Внутри где-то увидел команду delete this. Она, наверное, не в деструкторе должна быть а просто в каком-то методе? |
|||
|
||||
| 17dufa |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 2.3.2006 Репутация: 3 Всего: 5 |
Dims, у COM объектов насколько мне известно реализован механизм автоматической сборки мусора путем подсчета количества ссылок.
|
|||
|
||||
| SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: 2 Всего: 23 |
Dims, как и сказал 17dufa у них идёт подстчёт ссылок -
AddRef и Release. Собствено, Release и делает (должен делать) delete this, когда счётчик ссылок становится равным нулю. С точки срения стандарта всё ОК, главное потом этот обьект не юзать, для которого delete this был вызван |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
для всяких там комов new делается внутри функции-фабрики, код которой (в частности код выделения памяти, malloc или что-то такое) находится, чаще всего, в dll
для симметричности код удаления (free) должен находится в той же dll, иначе можно получить очень странные ошибки, связанные с тем, что dll может быть собрана немного по-другому, а потому реализация функций malloc и free у нее будет отличаться от реализации malloc и free в exe-шке потому для работы со всеми экземплярами классов, реализация которых находится в dll, нужно внутри dll иметь фабрики для создания и функции типа Delete для уничтожения в коме это немного автоматизировано и формализировано Это сообщение отредактировал(а) Alek86 - 3.11.2009, 17:31 |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Спасибо всем! Вроде бы это всё очевидно, но как-то непривычно. Привык, что раз new, значит должен быть delete. А delete this вообще первый раз в жизни встретил
|
|||
|
||||
| DrHex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 2.5.2009 Репутация: нет Всего: нет |
Dims не далайте сами COM объектам new, этим должна заниматься фабрика...
--------------------
google.com и это все. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |