COM:我可以在不调用Release的情况下调用ConInitialize吗?

COM:我可以在不调用Release的情况下调用ConInitialize吗?,com,memory-leaks,resource-leak,Com,Memory Leaks,Resource Leak,我有一个疑问。我初始化COM,进行CoCreateInstance并使用一些接口。我可以调用ConInitialize而不调用Release吗?它是否会导致内存/资源泄漏 提前感谢,, -马尼。来自MSDN: 应该调用coninitialize 应用程序关闭,作为最后一次调用 在 应用程序隐藏其主窗口和 通过其主消息循环。 如果有公开的对话 剩余的,初始化启动一个 模式消息循环并分派任何 来自容器的挂起消息 或此COM应用程序的服务器。通过 发送消息, CoUninitialize确保 应用程

我有一个疑问。我初始化COM,进行CoCreateInstance并使用一些接口。我可以调用ConInitialize而不调用Release吗?它是否会导致内存/资源泄漏

提前感谢,, -马尼。

来自MSDN:

应该调用coninitialize 应用程序关闭,作为最后一次调用 在 应用程序隐藏其主窗口和 通过其主消息循环。 如果有公开的对话 剩余的,初始化启动一个 模式消息循环并分派任何 来自容器的挂起消息 或此COM应用程序的服务器。通过 发送消息, CoUninitialize确保 应用程序之前不会退出 正在接收其所有挂起的消息。 非COM消息将被丢弃


您应该只在关机时调用CoUninitialize,到那时内存泄漏就无关紧要了。

好的,CoUninitialize“应该”释放当前线程上正在使用的所有COM资源。不过我不相信它。我宁愿确保在调用uninitialise之前释放所有内容。

对于对象,不应该使用coninitialize()而不是调用
IUnknown::Release()
,它们是不同的函数

IUnknown::Release()
只会减少对象的引用计数,并可能导致其销毁。如果不使用编组,则直接通过vtable执行此调用(控制直接传递到COM服务器代码中),COM子系统甚至不为此执行任何操作

coninitialize()将为调用线程释放COM相关资源,我猜这些线程正在编组相关对象。如果不使用编组,对象将保持未发布状态,因为只有您的代码知道它们


这就是为什么不应该使用一个而不是另一个。

无论是否取消COM初始化,忽略释放调用都会导致对象在服务器端保持活动状态,可能会使整个服务器无缘无故地运行(如果不是作为服务运行)。换句话说,服务器端会出现内存泄漏,这只能通过重新启动COM服务器来消除

我记得当我第一次开始使用COM时问过类似的问题。我正在处理的客户机使用了许多线程,我试图为每个线程完成的不同任务重用接口。这使得管理接口缓存相当困难。最终,没有捷径可走。除非您使用MTA、GIT或接口封送,否则创建接口的线程也必须释放它


为了让您更轻松,请尝试使用来管理您创建的接口。与常规指针一样,使用智能指针有时可以让您的生活更轻松。

“您应该只在关机时调用ConInitialize”。这并非完全正确。当您销毁任何已共同初始化的线程时,应该调用它。通常情况下,这些线程在关机前很久就被终止了。这是真的,我想我从来没有在这种情况下使用过它。这是一个完全正确的问题,但请您详细说明一下为什么要问这个问题?只是好奇或者在适当地释放对象时遇到问题?谢谢。如果我真的像tat一样使用,即在不调用Release的情况下初始化?它是否会造成泄漏方面的任何危害?我对此很感兴趣,因为我需要根据您的回答进行更改。如果封送被禁用,对象将被泄漏。请编辑您的问题并详细说明您想要更改的内容、方式和原因好吗?抱歉,评论太晚了。我用CComPtr解决了这个问题。谢谢大家的关注-马尼。