【问题标题】:Get number of blocks allocated on the heap to detect memory leaks获取堆上分配的块数以检测内存泄漏
【发布时间】:2013-03-17 17:16:27
【问题描述】:

是否有可用的函数可以获取当前在堆上分配的内存块数?它可以是 Windows/Visual Studio 特定的。

我想用它来检查函数是否泄漏内存,而不使用专用的分析器。我正在考虑这样的事情:

int before = AllocatedBlocksCount();
foo();
if (AllocatedBlocksCount() > before)
    printf("Memory leak!!!");

【问题讨论】:

  • 只需循环运行您的代码并查看任务管理器:P
  • 如果没有这样的功能,可以作为替代,是的。但并非总是如此,某些函数不能循环运行,因为它们从套接字等读取,并且服务器不会重新发送相同的数据。有时状态改变了,函数不能以同样的方式第二次运行。这只能用于非常简单的功能。
  • @Alon 分配的堆内存和保留的操作系统(任务)内存之间可能存在巨大差异。
  • CRT,这些功能你试过了吗? msdn.microsoft.com/en-gb/library/x98tx3cf.aspx
  • 谢谢,_CrtMemDifference 似乎是我要找的。​​span>

标签: c++ visual-studio memory-leaks


【解决方案1】:

有几种方法可以做到这一点(特定于 Microsoft Visual Studio 附带的 CRT。)

一种方法是在您感兴趣的通话前后使用_CrtMemCheckpoint()函数,然后与_CrtMemDifference()比较差异。

_CrtMemState s1, s2, s3;

_CrtMemCheckpoint (&s1);
foo(); // Memory allocations take place here
_CrtMemCheckpoint (&s2);

if (_CrtMemDifference(&s3, &s1, &s2)) // Returns true if there's a difference
   _CrtMemDumpStatistics (&s3);

您还可以使用_CrtDoForAllClientObjects() 枚举所有分配的块,以及使用 Visual C++ CRT 的调试例程的其他几种方法。

注意事项:

  • 所有这些都在<crtdbg.h> 标头中。
  • 它们显然只适用于 Windows 和使用 VC 编译时。
  • 您需要设置 CRT 调试和一些标志和其他东西。
  • 这些是相当棘手的功能;请务必仔细阅读 MSDN 的相关部分。
  • 这些在调试模式下工作(即与调试 CRT 和定义的 _DEBUG 宏链接。)

【讨论】:

猜你喜欢
  • 2020-02-18
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2016-10-13
  • 2016-09-12
相关资源
最近更新 更多