Rのガベージコレクション

Rのガベージコレクションはリファレンスカウント方式ではない。ということは,Cで拡張を書くとき,スタック上のRオブジェクトを開放しないためには,R自身にRオブジェクトを知らせる必要がある*1
これを行うのがPROTECT(robj)というマクロで,Rオブジェクトを使い終わったらUNPROTECT(n)に登録したオブジェクトの個数を渡す。

PROTECT(ans = allocVector(VECSXP, n));
/* ... */
UNPROTECT(1);

PROTECT-UNPROTECT間でerror()などとするとまずいことが起きる気がする。

*1:Rubyでは,Ruby自身がCのスタックを走査してよきに計らってくれる。