当内存分配数不总是相同时如何检测内存泄漏?

How to detect memory leak when memory allocation number isn't always same?

我的程序出现了这样的内存泄漏(55 字节)。 我正在使用 C++、MFC、Visual Studio 2010.

检测到内存泄漏! {13497} 0x0E44C248 处的正常块,55 字节长。 数据:44 3A 5C 46 44 41 53....

问题是,内存分配编号“13497”并不总是相同。如果我再次 运行 程序,它总是不同的数字。 我想找到我在退出前没有释放内存的地方,用_crtBreakAlloc,但似乎不可能在内存分配号上中断。 我也使用了_CrtSetDbgFlag和_CrtDumpMemoryLeaks,但也没有很好地工作。

在这种情况下有什么方法可以检测内存泄漏吗?

谢谢。

嗯,有几种方法可以解决这个问题。

  1. 查看数据转储以查找您可能认识的任何类型的字符串。这可能会帮助您找到它。
  2. 在内存分配上放置一个条件断点,仅当请求(或分配)的大小为 55 字节时才会中断。
  3. 您可能会通过在 header 中尽早放置这样的内容来获得更好的结果,您的所有代码都包含(例如 stdafx.h)

此代码重新映射运算符 new

#ifdef _DEBUG
#    define _CRTDBG_MAP_ALLOC
#    include <crtdbg.h>
#    include <new>
#    include <memory>
#    define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#    define new DEBUG_NEW
#endif
  1. 此外,泄漏的内存量是否会随着您 run/use 您的应用程序的增加而增加?如果不是,它可能根本就不是泄漏。有时您会收到有关静态分配 objects 的泄漏报告。至少,仔细看看你所做的静态分配

您可以使用像 cppcheck 这样的静态分析器,或者如 Joe 所说,重新映射运算符 new

我开发了一些您可以使用的内存泄漏实用程序:

https://github.com/check69/Utils/blob/master/leaks.cpp

https://github.com/check69/Utils/blob/master/leaks.h

有一些 visual studio 指令可以获取控制台输出中的漏洞,以便于调试。

PS: 我会把这个作为评论放在joe post,但是我需要50分才能发表评论。

您好,感谢您的回答..

我使用 https://vld.codeplex.com/ 中的 "Visual Leak detector" 很容易找到泄漏位置 我强烈推荐这个给那些有同样问题的人。 :) 您可以下载它并将其放入您的项目中。