首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CoCreateInstance时内存泄漏

使用CoCreateInstance时内存泄漏
EN

Stack Overflow用户
提问于 2011-01-19 15:02:14
回答 1查看 2.9K关注 0票数 4

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

代码语言:javascript
复制
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#类也非常简单:

代码语言:javascript
复制
 [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可以监视人工堆,并且不会指向托管部件中的内存泄漏.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-01-19 16:48:03

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

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

真正的内存泄漏是在没有上限的情况下增加进程的VM大小的泄漏。让自己相信这不是真正的内存泄漏,因为它运行了10亿次这段代码。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4736788

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档