使用CoCreateInstance时内存泄漏

时间:2011-01-19 15:02:14

标签: c++ com memory-leaks

我正在使用COM通过c ++非托管代码初始化C#.NET类,即使在一个非常基本的程序中我也检测到内存泄漏:

int _tmain(int argc, _TCHAR* argv[])
{
 CoInitialize(NULL);
 ComClass::IClass1 *_comClass1;
 HRESULT hr = CoCreateInstance(__uuidof(ComClass::Class1),
         0,
         CLSCTX_INPROC_SERVER,
         __uuidof(ComClass::IClass1),
         reinterpret_cast<void**>(&_comClass1));
 _comClass1->Release();
 CoUninitialize();
 return 0;
}

C#类也非常简单:

 [ComVisible(true), Guid("A95C4F43-65B0-4706-94D1-BEE2EF416766")]
    public interface IClass1
    {
    }

    [ComVisible(true), Guid("4670C9CD-0501-4274-BF03-E1FF65A77FEC")]
    public class Class1 : IClass1
    {
        public Class1()
        { }
    }

我仍然在检测内存泄漏。我正在使用GlowCode和Purify来检测泄漏,但即使没有它们,我也可以看到内存使用率上升。

我没有正确使用CoCreateInterface吗?我错过了什么?


澄清

这只是我为模拟问题而创建的一个小程序。在我的真实程序中有很多CoCreateInstance调用,并且VM大小上升到大约1.5GB,当然这不正常......此外,我可以看到使用perfmon进程'私有字节正在上升,而所有堆中的.Net CLR内存字节都没有。此外,GlowCode可以监视mananged堆,并且不会指向托管部分中的内存泄漏......

1 个答案:

答案 0 :(得分:6)

是的,这很正常。第一次调用CoCreateInstance会将CLR加载到您的进程中。它创建了主要的AppDomain来加载托管代码,垃圾收集堆,加载器堆和一些内部数据结构。在接口指针上调用Release()方法卸载CLR。它坚持为将来加载和执行托管代码的任何请求提供服务。在进程终止之前,主应用程序域不会被卸载。

非托管内存诊断工具不会知道这是正常的。

真正的内存泄漏是在没有上限的情况下增加进程的VM大小的内存泄漏。通过运行此代码十亿次,说服自己这不是真正的内存泄漏。