C++ 协同初始化失败

C++ 协同初始化失败,c++,windows,com,C++,Windows,Com,我们有多线程应用程序。当我们使用一些C++ COM对象来进行DB操作时,每个线程都必须用CONTIALIVE调用。该应用程序在生产环境中可以长时间正常工作。但是,thread init函数中的contialize()API突然失败,出现以下错误 ThreadInit;HRESULT:80070008:存储空间不足,无法处理此命令。 操作系统:带SP2的Windows Server 2003 R2。我在stackoverflow找到了一份工作 在windows注册表中将控制台应用程序的堆大小从51

我们有多线程应用程序。当我们使用一些C++ COM对象来进行DB操作时,每个线程都必须用CONTIALIVE调用。该应用程序在生产环境中可以长时间正常工作。但是,thread init函数中的contialize()API突然失败,出现以下错误 ThreadInit;HRESULT:80070008:存储空间不足,无法处理此命令。 操作系统:带SP2的Windows Server 2003 R2。我在stackoverflow找到了一份工作 在windows注册表中将控制台应用程序的堆大小从512 KB增加到1MB。我能做到。但我想知道,首先发生这种情况的可能原因是什么。环境保护署最近没有改变。在这台机器上运行着其他几个进程,它们可以调用Coinitialize而不会出现任何问题。只有两个过程失败了。提前感谢“在当前线程上初始化COM库”,这确实需要内存

我的猜测是,您的生产环境遇到了应用程序堆大小不足以在新线程上初始化COM的情况。也许您遇到了这样一种情况,即您分配了比以前更多的线程,即使应用程序运行的时间没有以前长


提高堆大小可以解决这一问题,因为这将允许这些线程正确初始化。

某些地方出现泄漏。首先假设它是您的程序。您可以使用Taskmgr.exe、进程选项卡、查看+选择列和勾选句柄、GDI对象和用户对象来观察其句柄使用情况。在应用程序运行时观察这些数字。如果它们稳步上升,那么代码中的句柄就会泄漏。当一个栏目达到10000个时,演出就结束了


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

您是否有机会从DllMain调用DLL\u线程\u附加?这很可能会导致死锁或导致泄漏


我假设内存泄漏发生在索引

的某个地方,您使用了多少线程?这是一个变量计数。它可以是7到64之间的任何值。当问题发生时,我没有看到超过10个线程在运行。谢谢谢谢,我正在等待客户对dheamon总结报告的反馈。这将有助于任何堆大小问题。如果我提供了增加堆的选项,它将运行几天。我没有再次报告同样的问题。非常感谢。