Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Почему не надо уничтожать new объекты?


Автор: Dims 3.11.2009, 15:43
Заметил, что объекты DirectShow (и, наверное, все объекты COM), надо создавать на хипе при помощи new, а уничтожать при помощи delete не надо.

Как они так сделали?

Внутри где-то увидел команду delete this. 

Она, наверное, не в деструкторе должна быть а просто в каком-то методе?

Автор: 17dufa 3.11.2009, 16:15
Dims, у COM объектов насколько мне известно реализован механизм автоматической сборки мусора путем подсчета количества ссылок.

Автор: SenkraD 3.11.2009, 16:35
Dims,  как и сказал 17dufa у них идёт подстчёт ссылок -
AddRef и Release. Собствено, Release и делает (должен делать) delete this,
когда счётчик ссылок становится равным нулю.

С точки срения стандарта всё ОК, главное потом этот обьект не юзать,
для которого delete this был вызван 

Автор: Alek86 3.11.2009, 17:29
для всяких там комов new делается внутри функции-фабрики, код которой (в частности код выделения памяти, malloc или что-то такое) находится, чаще всего, в dll

для симметричности код удаления (free) должен находится в той же dll, иначе можно получить очень странные ошибки, связанные с тем, что dll может быть собрана немного по-другому, а потому реализация функций malloc и free у нее будет отличаться от реализации malloc и free в exe-шке

потому для работы со всеми экземплярами классов, реализация которых находится в dll, нужно внутри dll иметь фабрики для создания и функции типа Delete для уничтожения
в коме это немного автоматизировано и формализировано

Автор: Dims 3.11.2009, 21:03
Спасибо всем! Вроде бы это всё очевидно, но как-то непривычно. Привык, что раз new, значит должен быть delete. А delete this вообще первый раз в жизни встретил smile

Автор: DrHex 5.11.2009, 14:10
Dims не далайте сами COM объектам new, этим должна заниматься фабрика...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)