我正在使用valgrind来检查我的程序是否在一个类所需的内存范围内。当我运行massif时,我得到一张漂亮的图表,表示我的最大内存使用量(堆+堆栈)是21 KB。当我运行valgrind的memcheck时,它告诉我我分配了185931个字节。他们报道的内容有何不同?如果它很重要,我的代码中有一个步骤,我捕获两个字符串,所以我用realloc调整第一个,strcat两个字符串,然后释放第二个。
答案 0 :(得分:6)
Memcheck旨在寻找内存泄漏,因此它计算所有内存分配的总和(以及所有释放的总数)。
Massif旨在查看程序的内存占用量,因此它会计算程序中每个点的总内存使用量。
换句话说,如果你的程序是这样的:
int main(void)
{
free(malloc(10*1024));
free(malloc(10*1024));
return 0;
}
然后Memcheck会告诉你:
total heap usage: 2 allocs, 2 frees, 20,480 bytes allocated
而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)
(在程序的整个生命周期中,分配了20480个字节;但峰值使用量仅为10240字节)。