是否可以使用非托管C库从C#程序集中使用CRT库?

时间:2013-11-18 10:44:44

标签: c# c visual-studio-2012 memory-leaks

我有一个托管程序集,可以调用非托管程序集。在非托管程序集中,我可以使用CRT库来寻找内存泄漏,但大多数情况下,托管程序集也会调用非托管程序集来清理某些内容。

对非托管程序集的调用可以例如返回指向某些非托管内存的指针。然后它将被编组到托管内存中,之后,将调用无人组件来释放非托管内存。

那么,是否可以使用托管程序集中的CRT?或者VS2012中还有其他工具可以从C#库中进行内存泄漏检测(因为这是一个托管库,我觉得看到内存泄漏工具很奇怪......)。

1 个答案:

答案 0 :(得分:1)

这很少有好结果。典型的Windows安装可以很容易地拥有少量不同版本的CRT dll。常见的有msvcrt.dll,msvcr70.dll,msvr71.dll,msvcr80.dll,msvcr90.dll,msvcr100.dll,msvcr110.dll,msvcr120.dll。毫无疑问,你会看到这种模式。特别是msvcr80和msvcr90版本很棘手,它们需要一个清单才能加载,因为它们存储在Windows并排缓存中(c:\ windows \ winsxs)。

您也会遇到根本不使用CRT的DLL版本的非托管代码的问题。设计用作通用库的DLL非常常见,它们将CRT代码链接到DLL本身,/ MT编译选项。

你加载的那个和DLL使用的那个不匹配是致命的,你总是会使用错误的分配器,因为CRT会创建自己的堆。

<crtdbg.h>的特定情况下,这不是必需的。您的托管代码根本不会分配CRT内存,因此也不会导致泄漏。您唯一需要做的就是确保生成泄漏报告。使用_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF),这是自动的。不要发送Debug版本。