En el siguiente código, objeto de tipo foo se crea con una llamada a foo_new() y un puntero externo al objeto se devuelve al R Los cálculos posteriores se realizan pasando ptr_foo. El objeto finalmente se libera con una llamada explícita a foo_free (foo * X). Todos los cálculos son realizados por libfoo.R .call() de interfaz y EXTPTRSXP: La comprensión de Protección/desprotección con objetos asignados externamente
El hecho de que ptr_foo fue creado significa que todos los otros campos asignados dinámicamente dentro del objeto foo están protegidos de forma automática? ¿O es posible que campos como "barra" puedan ser eliminados por el recolector de basura?
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);
}
Gracias,
RT
Gracias Tommy. Eso es lo que esperaba. Como indica, todo el intercambio de datos entre R y libfoo ocurre copiando SEXPs dentro y fuera. Todos los objetos asignados por la biblioteca son liberados por una llamada foo_free(). – user151410