ガーベージコレクタ
メモリリークの問題に悩まされている人は多いと思います。ガーベージコレクタを使うと、メモリ管理の煩わしさから解放されます。
Boehm GC
#include <gc/gc.h> void GC_INIT(void); void *GC_MALLOC(size_t size); void *GC_MALLOC_ATOMIC(size_t size); void *GC_REALLOC(void *ptr, size_t size); size_t GC_get_heap_size(void);
Boehm GCと呼ばれているガーベージコレクタです。Debianならlibgc-dev、MacのFinkならgcという名前のパッケージになっています。
基本的にmalloc()、realloc()と使い方は同じですが、GC_MALLOC()は確保した領域を0で初期化します。
GC_MALLOC_ATOMIC()は、確保した領域にポインタを置かない場合(例えば文字列等)に使います。ガーベージコレクタの動作が速くなります。また、確保した領域を0で初期化しません。
これら三つの関数は、実際はマクロとして定義されており、GC_DEBUGが定義されているとデバッグ用の関数に置き換わります。メモリ関係のエラーが出る場合はGC_DEBUGを定義してみましょう(GC_DEBUGはgc.hを組み込む前に定義する必要があります)。
GC_INIT()はガーベージコレクタを初期化し、GC_get_heap_size()は、このライブラリが確保しているメモリの総量を返してくれます。
使い方
こんなひどいコードを書いても使用するメモリの量は一定です。
#include <gc/gc.h> #include <stdio.h> int main() { char *s; int i; GC_INIT(); for (i=0;;i++) { s=(char*)GC_MALLOC(100*sizeof(char)); } return 0; }