Я знаю, что современные версии Windows возвращают память, которая была ранее приобретена с malloc
, new
и тому подобное, после завершения программы, но как насчет COM-объектов? Я должен звонить obj->Release()
на них при выходе из программы, или система сделает это для меня?
Я думаю, это: это зависит. Для вне процесса COM, я должен, вероятно, всегда звонить Release()
, но для внутрипроцессного COM, я думаю, это действительно не имеет значения, потому что объекты COM умирают после завершения программы в любом случае.
Если вы находитесь в самом процессе, то да, вы должны, так как вы можете не знать, где находится сервер, и сервер может быть не в работе. Если вы находитесь в DLL, это становится сложнее.
В DLL вы должны Если вы не получили DLL_PROCESS_DETACH
уведомление, в этом случае вы должны абсолютно ничего не делать и просто закрыть приложение. Это связано с тем, что это уведомление вызывается во время завершения процесса. Как таковой, слишком поздно, чтобы навести порядок в этой точке. Ядро, возможно, уже восстановило блоки, которые вы называете release
на.
Помните, что, как писатель DLL, вы ничего не можете сделать, если процесс завершается изящно, вы можете делать только то, что можете в пределах разумного, чтобы очистить себя после изящного выхода.
Одним из простых решений является использование умных COM-указателей везде, АТЛ а также WRL есть реализации, которые работают хорошо и делают это так, что вам не придется беспокоиться об этом по большей части. Даже если они хранятся статически, их деструкторы будут вызываться до прекращения процесса или выгрузки DLL, таким образом, освобождаются безопасно в то время, когда это безопасно.
Таким образом, короткий ответ Если ты можешь например ты всегда должен звонить release
если это безопасно. Однако бывают случаи, когда это не так, и вам определенно НЕ следует ничего делать.
В зависимости от реализации базового объекта может быть или не быть штраф. Объект может иметь состояние, которое сохраняется после завершения процесса. Постоянная блокировка в локальной базе данных — самый простой пример, который приходит на ум.
Имея это в виду, я говорю, что на всякий случай лучше позвонить в Release.
Если вы не выпускаете COM-указатели должным образом, а COM-активность включает маршалинг, вы, скорее всего, будете иметь исключения в CoUninitialze
которые одновременно раздражают и / или могут показать пользователю сообщение о сбое процесса.