混合模式项目的内存泄漏检测:托管,非托管和本机

时间:2011-10-14 20:12:25

标签: c++ memory-leaks c++-cli native unmanaged

我有一个Visual Studio 2010解决方案,其中包含C#(托管),C ++ / CLI(非托管)和纯C ++(本机)项目。我想在所有3个项目中执行内存泄漏检测,或者至少围绕本机代码执行内存泄漏检测:

  • C#项目引用了非托管dll(我可以访问常用的.NET内存分析工具,因此在它上运行内存分析并不是一个真正的问题。)
  • C ++ / CLI是一个围绕原生C ++库的非常瘦包装器,所以我真的不需要对它进行分析(不用担心它)。
  • C ++本机代码是最难分析的代码。

我已经尝试过使用英特尔Inspector XE 2011,但它太慢了......做一个简单的事情就像只是初始化我的系统并花了很长时间才完成我还没有完成它。当我在没有IXE 2011的情况下运行我的系统时,初始化我的系统需要不超过10-15秒,而使用IXE我们让它运行几个小时并且它不会超过初始化。我试图排除某些库被分析,但它绝对没有效果。

我尝试过使用Visual Leak Detector,但在完成运行后它说它找不到任何内存泄漏。我对这个结果持怀疑态度,所以我故意在经常运行的函数中放置一段代码以确保存在内存泄漏:

int* memoryLeak = new int;

我再次使用VLD运行,但它吐出了相同的消息。我正在考虑覆盖new / delete运算符,甚至只覆盖malloc / free,但我想确保在我之前已经用尽所有其他选项深入研究。

如何使用Visual Studio 2010分析我的本机C ++库的内存使用情况?是否有其他可能有效的工具或技术(即使它们没有与VS2010集成)?

2 个答案:

答案 0 :(得分:2)

在.NET中,即使你使用托管对象,也可能会有一些东西永远不会被处理掉(请查看一些示例:Memory Leak in C#)。

关于原生部分,您可以使用两种不同的方法:

答案 1 :(得分:1)

进行单元测试,测试单元是否存在内存泄漏: http://msdn.microsoft.com/en-us/library/x98tx3cf.aspx

在分配对象之前获取第一个内存状态,在释放之后获取第二个内存状态。比较你的记忆状态。

此外,您可以尝试使用其他分析器,如valgrind,devpartner。