1: main() 2: { 3: char *a,*b; 4: mtrace(); 5: 6: a=malloc(1024); 7: b=malloc(1024); 8: free(a); 9: }
aは開放しているけどbは開放していない。
mtrace()で記録開始。本来muntrace()が必要だけど無くても動く。
$ gcc -g malloctest.c
$ MALLOC_TRACE=hoge.log ./a.out
$ mtrace a.out hoge.log
Memory not freed:
-----------------
Address Size Caller
0x0804a780 0x400 at /home/hoge/malloctest.c:7
環境変数MALLOC_TRACEにログファイルを指定して実行するだけ。
mtraceコマンド(中身はperlスクリプト)で何がメモリリークしているかばっちりわかる。
でも、スレッドセーフではないらしい・・・惜しい・・・
革命の日々! mtraceの使い方
#include <mcheck.h> class unko { int x; int y; }; int main() { mtrace(); unko A; unko *B = new unko(); unko *C = new unko(); delete B; }
$ g++ -g malloctest2.c $ MALLOC_TRACE=hoge2.log ./a.out $ mtrace a.out hoge2.log Memory not freed: ----------------- Address Size Caller 0x0804a388 0x8 at 0xb7ec0fd7
C++でもなんとなくわかる。アドレスはあとでなんとか