Должен ли я всегда вызывать Release по указателям COM после завершения моей программы?

Я знаю, что современные версии Windows возвращают память, которая была ранее приобретена с malloc, new и тому подобное, после завершения программы, но как насчет COM-объектов? Я должен звонить obj->Release() на них при выходе из программы, или система сделает это для меня?

Я думаю, это: это зависит. Для вне процесса COM, я должен, вероятно, всегда звонить Release(), но для внутрипроцессного COM, я думаю, это действительно не имеет значения, потому что объекты COM умирают после завершения программы в любом случае.

2

Решение

Если вы находитесь в самом процессе, то да, вы должны, так как вы можете не знать, где находится сервер, и сервер может быть не в работе. Если вы находитесь в DLL, это становится сложнее.

В DLL вы должны Если вы не получили DLL_PROCESS_DETACH уведомление, в этом случае вы должны абсолютно ничего не делать и просто закрыть приложение. Это связано с тем, что это уведомление вызывается во время завершения процесса. Как таковой, слишком поздно, чтобы навести порядок в этой точке. Ядро, возможно, уже восстановило блоки, которые вы называете release на.

Помните, что, как писатель DLL, вы ничего не можете сделать, если процесс завершается изящно, вы можете делать только то, что можете в пределах разумного, чтобы очистить себя после изящного выхода.

Одним из простых решений является использование умных COM-указателей везде, АТЛ а также WRL есть реализации, которые работают хорошо и делают это так, что вам не придется беспокоиться об этом по большей части. Даже если они хранятся статически, их деструкторы будут вызываться до прекращения процесса или выгрузки DLL, таким образом, освобождаются безопасно в то время, когда это безопасно.

Таким образом, короткий ответ Если ты можешь например ты всегда должен звонить release если это безопасно. Однако бывают случаи, когда это не так, и вам определенно НЕ следует ничего делать.

4

Другие решения

В зависимости от реализации базового объекта может быть или не быть штраф. Объект может иметь состояние, которое сохраняется после завершения процесса. Постоянная блокировка в локальной базе данных — самый простой пример, который приходит на ум.

Имея это в виду, я говорю, что на всякий случай лучше позвонить в Release.

3

  • в процессе COM-объект умрет с процессом
  • ссылка вне процесса будет выпущена по тайм-ауту
    • плохо спроектированные серверы и клиенты могут оставаться в плохом состоянии, удерживая указатели на объекты (обычно прокси-серверы), которые больше не доступны, и не могут видеть, что они мертвы. будучи не в состоянии избавиться от них
    • Это всегда хорошая идея, чтобы отпустить указатели изящно

Если вы не выпускаете COM-указатели должным образом, а COM-активность включает маршалинг, вы, скорее всего, будете иметь исключения в CoUninitialze которые одновременно раздражают и / или могут показать пользователю сообщение о сбое процесса.

2
По вопросам рекламы [email protected]