ガーベージコレクタ

メモリリークの問題に悩まされている人は多いと思います。ガーベージコレクタを使うと、メモリ管理の煩わしさから解放されます。

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、MacFinkなら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;
}
コンパイル

プログラムが書かれたファイル名をtest.cとします。

Linux

gcc -lgc test.c

Mac(ライブラリをFinkでインストールした場合)

gcc -lgc -L/sw/lib -I/sw/include test.c