c++ - 使用 CoCreateInstance 时内存泄漏

标签 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#类也 super 简单:

 [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 看到进程的私有(private)字节在上升,而所有堆中的 .Net CLR 内存字节都没有。 GlowCode 还可以监视托管堆并且不会指向托管部分中的内存泄漏...

最佳答案

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

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

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

关于c++ - 使用 CoCreateInstance 时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4736788/

相关文章:

c++ - 为什么这段代码没有找到我的集合中最长字符串的长度?

ios - 当对象 A 将对象 B 作为属性并且对象 B 有包含对象 A 的数组属性时,Swift 中的保留循环?

javascript - DOM 何时从内存中移除?

c++ - C++03使用函数调用结果初始化多个成员?

c++ - 带文本格式的 QT 日志记录

c# - vb6 com 服务器中属性和事件之间的歧义

c# - 没有托管堆是否可以进行 DI?

java - 什么是好的 java 调试器?

c++ - 将 char* 返回为字符串文字

c# - 从 C# 文件中提取缩略图和图标