Boehm GC

Boehm–Demers–Weiser garbage collector

種別ガベージコレクタ
ウェブサイトhttp://www.hboehm.info/gc/

Boehm–Demers–Weiserガベージコレクタ、またはBoehm GCは、C/C++言語で保守的ガベージコレクションを行うライブラリです。

動作原理

マークスイープフェーズで参照を辿って、到達できないオブジェクトを回収します。

スタックやstatic領域にある値を全てポインタとみなし、参照先を辿ります。 参照先がGC_mallocで確保した領域であれば、その中身も同様に全てポインタであるとみなして、マークを付けながら参照先を辿ります。 最終的にマークの付いていないヒープ領域のオブジェクトを回収します。

C言語サンプルコード

#include <gc/gc.h>

typedef struct {
  int buf[1024];
} Hoge;
typedef struct {
  Hoge *h[1024];
} Piyo;

int main(void)
{
  for (int i = 0; i < 100000; i++){
    // 内部にポインタを含む
    Piyo *p = GC_malloc(sizeof(Piyo));
    // 内部にポインタを含まない
    Hoge *h = GC_malloc_atomic(sizeof(Hoge));

    int *array = GC_malloc_atomic(256 * sizeof(int));
    array = GC_realloc(array, 1024 * sizeof(int));

    // 自分で回収する
    Hoge **hoge = GC_malloc_uncollectable(sizeof(Hoge*));
    GC_free(hoge);
  }
  GC_gcollect();

  return 0;
}

C++サンプルコード

#include <gc/gc_cpp.h>

// gcクラスを継承すれば、自動的に回収される
// デストラクタは呼び出されない
class Hoge : public gc
{
public:
  ~Hoge(){
    printf("Hoge::~Hoge()\n");
  }
};

// GCで回収されるとき、デストラクタが呼び出される
class Piyo : public gc_cleanup
{
public:
  ~Piyo(){
    printf("Piyo::~Piyo()\n");
  }
};

int main()
{
  for (int i = 0; i < 100000; i++){
    Hoge *h = new Hoge;
    Piyo *p = new Piyo;
  }
  return 0;
}

外部リンク