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)