1

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

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

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

1 回答 1

2

有几种方法可以做到这一点(特定于 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定义的宏链接。)
于 2013-03-27T15:32:08.317 回答