massif的内存数和memcheck的内存数有什么区别?

AVB*_*AVB 2 c valgrind

我正在使用valgrind来检查我的程序是否在一个类所需的内存范围内.当我运行massif时,我得到一张漂亮的图表,表示我的最大内存使用量(堆+堆栈)是21 KB.当我运行valgrind的memcheck时,它告诉我我分配了185931个字节.他们报道的内容有何不同?如果它很重要,我的代码中有一个步骤,我捕获两个字符串,所以我用realloc调整第一个,strcat两个字符串,然后释放第二个.

caf*_*caf 6

Memcheck旨在寻找内存泄漏,因此它计算所有内存分配的总和(以及所有释放的总数).

Massif旨在查看程序的内存占用量,因此它计算程序中每个点的总内存使用量.

换句话说,如果您的程序如下所示:

int main(void)
{
    free(malloc(10*1024));
    free(malloc(10*1024));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后Memcheck会告诉你这个:

total heap usage: 2 allocs, 2 frees, 20,480 bytes allocated
Run Code Online (Sandbox Code Playgroud)

而Massif会告诉你这个:

--------------------------------------------------------------------------------
  n        time(i)         total(B)   useful-heap(B) extra-heap(B)    stacks(B)
--------------------------------------------------------------------------------
  0              0                0                0             0            0
  1        130,386           10,248           10,240             8            0
  2        131,436           10,248           10,240             8            0
99.92% (10,240B) (heap allocation functions) malloc/new/new[], --alloc-fns, etc.
->99.92% (10,240B) 0x8048407: main (in /home/kevin/miscdev/so/x)
Run Code Online (Sandbox Code Playgroud)

(在程序的整个生命周期中,分配了20480个字节;但峰值使用量仅为10240字节).