valgrindを使ってみる。

install簡単。

sudo apt-get install valgrind

使い方(メモリまわりのチェック)

    • tool=$hoge でツールの選択。メモリチェッカーをつかって、
    • leak-check=fullで該当箇所がわかる。
valgrind --tool=memcheck --leak-check=full $command

メモリの取り扱いがダメなつくりをわざと作ってしらべてみる。

#include <stdlib.h>

//明らかなメモリリーク
void leak(){
    new int;
    new double;
}
//mallocしたより後ろのデータをかいてしまう
void after_malloc(){
    char *s = (char *)malloc(sizeof(char)*10);
    s[10] = 'a';
    free( s );
}

//2回free
void double_free(){
    char *s = (char *)malloc(sizeof(char)*10);
    free(s);
    free(s);
}
// new[]なのにdelete[]じゃない
void invalid_free(){
    char *s = new char[10];
    delete s;
}
int main(){
    for(int i = 0 ;i< 100;i++)leak();
    for(int i = 0 ;i< 10 ;i++)after_malloc();
    double_free();
    invalid_free();
}

とすると、こんな出力結果。

==16326== Invalid write of size 1
==16326==    at 0x80485AF: after_malloc() (valgrind_memcheck.cc:10)
==16326==    by 0x8048616: main (valgrind_memcheck.cc:26)
==16326==  Address 0x42afbf2 is 0 bytes after a block of size 10 alloc'd
==16326==    at 0x4022AB8: malloc (vg_replace_malloc.c:207)
==16326==    by 0x80485A5: after_malloc() (valgrind_memcheck.cc:9)
==16326==    by 0x8048616: main (valgrind_memcheck.cc:26)
==16326==
==16326== Invalid free() / delete / delete
==16326==    at 0x402265C: free (vg_replace_malloc.c:323)
==16326==    by 0x8048590: double_free() (valgrind_memcheck.cc:17)
==16326==    by 0x8048625: main (valgrind_memcheck.cc:27)
==16326==  Address 0x42afe68 is 0 bytes inside a block of size 10 free'd
==16326==    at 0x402265C: free (vg_replace_malloc.c:323)
==16326==    by 0x8048585: double_free() (valgrind_memcheck.cc:16)
==16326==    by 0x8048625: main (valgrind_memcheck.cc:27)
==16326==
==16326== Mismatched free() / delete / delete 
==16326==    at 0x40222EC: operator delete(void*) (vg_replace_malloc.c:342)
==16326==    by 0x8048563: invalid_free() (valgrind_memcheck.cc:22)
==16326==    by 0x804862A: main (valgrind_memcheck.cc:28)
==16326==  Address 0x42afea8 is 0 bytes inside a block of size 10 alloc'd
==16326==    at 0x4022F14: operator new[](unsigned) (vg_replace_malloc.c:268)
==16326==    by 0x8048555: invalid_free() (valgrind_memcheck.cc:21)
==16326==    by 0x804862A: main (valgrind_memcheck.cc:28)