glibc 自带了一个 libmemusage 的库,用于收集应用程序运行时的内存使用情况。使用起来 很简单,只要在编译的时候添加 -lmemusage 即可。它使用 api hook 技术对 malloc, realloc,calloc和free 的调用进行监视,统计相应大小内存块的使用比率,并可给出简单 的内存申请与释放的统计信息,可以用于简单的判断时候有内存泄漏。

简单的例子

#include <stdlib.h>

#include <memory>

struct GlobalAlloc {
  void *p;
  GlobalAlloc() {
    p = malloc(1024);
  }

  ~GlobalAlloc() {
    free(p);
  }
};

GlobalAlloc g;

int main(int argc, char *argv[])
{
  (void)argc;
  (void)argv;


  char *array = new char[4096];

  (void)array;

  std::unique_ptr<char[]> pchar(new char[512]);

  return 0;
}

在 bash 运行之后会打印出程序的内存使用情况。

$ g++ -g main.cpp -o app
$ ./app

use-memusage

统计信息列出函数调用的次数,每个函数分配的内存总量,调用失败的次数,以及 释放的次数和释放总量。例子中总共调用三次 malloc,其中两次通过 new 操作符号 间接调用,泄漏的内存量为 4096B,与结果相吻合。
最下面的柱状图显示了各种内存块大小的使用比率。