2012-01-23 15 views
2

valgrindを使用して、自分のプログラムがクラスの必要なメモリ範囲内にあることを確認しています。私がマジフを実行すると、私の最大メモリ使用量(ヒープ+スタック)が21 KBであるというきれいなチャートが得られます。私がvalgrindのmemcheckを実行すると、185931バイトが割り当てられていることがわかります。何を報告しているの違いは何ですか?重要なのは、コードに2つの文字列を刻むステップがあるので、最初のものをreallocでサイズ変更し、2つの文字列をstrcatし、次に2つ目の文字列を解放します。massifのメモリ数とmemcheckのメモリ数の違いは何ですか?

+0

私はmemcheckが割り当ての総量を数えると思います。メモリを解放して新しいメモリを割り当てた場合、メモリチェックでカウントされますが、大まかには、ある瞬間に必要だった実際の物理量だけを測定します(ただし、これについてはわかりません)。 –

答えて

5

Memcheckはメモリリークを探すことを目的としているため、すべてのメモリ割り当ての合計(およびすべての解放の合計)をカウントします。

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) 

:山塊はあなたにこのことを教えてくれるのに対し

total heap usage: 2 allocs, 2 frees, 20,480 bytes allocated 

int main(void) 
{ 
    free(malloc(10*1024)); 
    free(malloc(10*1024)); 
    return 0; 
} 

その後Memcheckはあなたにこのことを教えてくれます(プログラムの存続期間中、20480バイトが割り当てられましたが、ピーク使用量は10240バイトのみでした)。

+0

将来の視聴者のために、memcheckは、reallocの実装とは無関係に、reallocをfreeとmallocのalloc/free countまでカウントします。 (私はそれがreallocへの呼び出しをキャプチャし、カウントを増やしてから "本当の" reallocを呼び出すと思うが、100%確実ではない。) – AVB

関連する問題