次のコードでは、foo_new()の呼び出しでfoo型のオブジェクトが作成され、オブジェクトへの外部ポインタがR ptr_fooを渡すことによって後続の計算が実行されます。オブジェクトはfoo_free(foo * X)を明示的に呼び出すと、最終的に解放されます。すべての計算はlibfooによって実行されます。R .call()インタフェースとEXTPTRSXP:外部で割り当てられたオブジェクトによる保護/保護解除の理解
ptr_fooが作成されたという事実は、fooオブジェクト内の他の動的に割り当てられたフィールドがすべて自動的に保護されることを意味しますか?または、 "bar"のようなフィールドがガベージコレクタによって掃除される可能性はありますか?
SEXP foo_new (SEXP n) {
SEXP ptr_foo;
foo *X = (foo*) foo_new(1, sizeof(foo));
//foo is protected from garbage collection
assert(X);
X->bar = (int*) foo_add_bar(INTEGER_VALUE(n));
//Is bar protected from garbage collection?
assert(X->bar);
PROTECT(ptr_foo = R_MakeExternalPtr(X, install("extptr_foo"), R_NilValue));
R_RegisterCFinalizerEx(ptr_foo, ptr_foo_finalize, 1);
UNPROTECT(1);
return (ptr_foo);
}
おかげで、
RT手始めに
ありがとうTommy。それが私が望んでいたものです。あなたが指摘しているように、Rとlibfooの間のすべてのデータ交換は、SEXPをコピーして出し入れすることによって行われます。ライブラリによって割り当てられたすべてのオブジェクトは、foo_free()呼び出しによって解放されます。 – user151410