ヒープからの参照 - GC

Hoge* hoge = new Hoge;
hoge->hige = new Hige;

hoge がどこからか参照されていて mark されるならば、同じくヒープ上にある hoge->hige も mark されないとまずいという話。


これは new で割り当ての際に size を保持しておいて、そのサイズ分領域を走査して他の参照がないか調べる必要がある。
この処理は、各ヒープに割り当てられた変数にたいして再帰的に実行するって感じ。
よしテスト通った。これにてヒープも終了!


と思ったら、gc 用のデータ(gc_heap_max/gc_heap_min)を静的変数にして入れておいたのだけど、こいつらが heap を参照していていつまで経っても解放されないというアホなバグが。


スマートな方法が浮かばなかったので、参照として mark されないように、以下のマクロで encode /decode することにしました。

#define GC_SAFE_POINTER(a) (((uint32_t)a >> 16) | (((uint32_t)a & 0x0000ffff) << 16))