В следующем коде объект типа foo создается с вызовом foo_new (), а внешний указатель на объект возвращается в R. Последующие вычисления выполняются путем передачи ptr_foo. Объект в конце концов освобождается с явным вызовом foo_free (foo * X). Все вычисления выполняются libfoo.
Означает ли тот факт, что 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