А моя позиция - объект не должен выполнять каких-либо действий без моего ведома. Ибо все, что нужна - я сделаю сам.
Только балбес,
не видящий дальше своего носа, может так считать, ты уж прости.
каких-либо действий без моего ведома.
Ты — не высшый разум, чтобы "твой ведом" был решающим для определения того, стоит ли выполнять действие или нет. Но это, опять же, от узости воображения.
Представь себе такой пример:
Компания закупила светомузыкальную аппаратуру, целый комплекс (за бешеную цену). Комплекс состоит из различных прожекторов, которые сами могут вращаться в нескольких осях и направлять свет в нужном направлении, сами могут включаться/выключаться и даже менять цвет! Все прожекторы подключаются к силовому шкафу, а сам шкаф подключается к компу, который этими прожекторами полностью управляет.
Вместе с аппаратурой была также прислана DLL-ка с функцией GetProjector(id), которая возвращает интерфейс COM-объекта, служащего для управления прожектором (повороты, изменение цвета, яркости). Причём, пока объект не создан, прожектор (сам прожектор и субблок в шкафу, отвечающий за этот прожектор) не инициализирован, т.е. обесточен, заблокирован, внутри субблока все реле разомкнуты и не крутится охлаждающий схемы кулер. При самом первом вызове GetProjector() создаётся объект. И в конструкторе этого объекта находится код, который отправляет в шкаф команду "инициализировать прожектор #id". При последующих вызовах GetProject() просто возвращается ссылка на созданный ранее (первым вызовом) объект-управлятор. Если при первом вызове (когда объект ещё не создан), после отправки команды "инициализировать прожектор #id", пришёл ответ "projector already in use", значит контролем над прожектором завладела другая программа.
После этого ты можешь управлять прожектором как хочешь, причём сразу из нескольких мест. Считается, что прожектор больше не нужен тебе, когда ты не держишь ни одной ссылки на объект-управлятор. И в деструкторе этого объекта-управлятора находится код, который отправляет в шкаф команду "shutdown projector #id".
Ты тупо самоубиваешь процесс, не давая деструкторам выполниться. Таким образом, команда "отключить прожектор" не отправляется, и после завершения твоего приложения прожектора продолжают работать. Их не выключить.
Ты запускаешь свою программу заново, но теперь на каждый запрос объекта-управлятора твоей программе отвечают "projector already in use" — правильно, команды деинициализации же не приходило.
Это пример, где невызывание деструктора даёт последствия "на лицо".
Вместого этого может быть просто класс, где в конструкторе что-то перехватывается (в чужих процессах, не в своём), а в деструкторе перехват снимается. Или конструктор может создавать удалённый поток, а в деструкторе ему будет слаться сообщение "завершись!". Или в конструкторе могут создаваться глобальные атомы, а в деструкторе удаляться.
Вот тебе несколько примеров, где невыполнение деструктора не только вредно, но и оставляет за собой мусор в системе. Я уже не говорю, о временных файлах, папках и подобном.
Ну и контрольный выстрел в голову: если пользователь COM-объекта и сам COM-объект находятся в разных аппартаментах (например Standard EXE юзает объект из ActiveX EXE), то объект живёт не в твоём АП. В твоём АП живёт лишь интерфейсная-заглушка, транслирующая RPC-вызовы. Так вот деструктор этой заглушки не вызовется, но заглушка умрёт. COM-сервер будет считать, что клиент по прежнему использует объект.