CoInitialize失败

我们有multithreading的应用程序。 每个线程在被初始化时都必须调用CoIntialize,因为我们使用一些C ++ COM对象来进行数据库操作。 该应用程序在生产env更长时间工作正常。 但是突然间,线程init函数中的CoIntialize()API失败,出现ThreadInit错误; HRESULT:80070008:没有足够的存储可用于处理此命令。 操作系统:Windows Server 2003 R2与SP2。 我在stackoverflow中find了一个解决scheme,在Windowsregistry中将控制台应用程序的heapsize从512 KB增加到1MB。 我可以做到这一点。 但是我想知道这个事情先发生的可能原因是什么。 env最近没变。 在该机器上运行的其他几个进程可以调用Coinitialize而没有任何问题。 它只有两个过程失败。 提前致谢

CoInitialize “初始化当前线程上的COM库”,它具有内存要求。

我的猜测是你的生产环境到了应用程序的堆大小不足以在新线程上初始化COM的地步。 也许你碰到了一个你分配了比以前更多的线程的场景,即使这个应用程序运行的时间不长。

提高堆大小可以解决这个问题,因为它可以让这些线程正确初始化。

某处漏水了 首先假定它是你的程序。 您可以通过Taskmgr.exe,Processes选项卡,View + Select列以及Handles,GDI对象和USER对象来观察它的句柄用法。 在您的应用运行时观察这些数字。 如果他们稳步爬升,那么你的代码泄露了句柄。 一旦一列达到10,000,演出结束。

内核内存池中空间不足的解释更加模糊。 在“性能”选项卡的Taskmgr中也可以看到。

有没有机会从DLLMain调用CoInitialize ,更重要的是在DLL_THREAD_ATTACH上? 这很可能会导致死锁或导致泄漏。

我猜想内存泄漏发生在线程本地存储的索引周围的某处