gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:12 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com