Aşağıdaki kodda, foo_new() çağrısıyla foo nesnesi oluşturulur ve nesneye bir dış işaretçiyi döndürür. Sonraki hesaplamalar ptr_foo geçirilerek gerçekleştirilir. Nesne en sonunda foo_free (foo * X) 'a açık bir çağrı ile serbest bırakılır. Tüm hesaplamalar libfoo tarafından gerçekleştirilir.R .call() interface ve EXTPTRSXP: Harici olarak ayrılmış nesnelerle PROTECT/UNPROTECT öğesinin anlaşılması
ptr_foo'nun yaratılmış olması, foo nesnesi içindeki tüm dinamik olarak ayrılmış alanların otomatik olarak korunacağı anlamına mı geliyor? Ya da, "bar" gibi alanların çöp toplayıcı tarafından uzaklaştırılması mümkün mü?
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);
}
sayesinde
RT başlayanlar için
Teşekkürler Tommy. Umduğum şey buydu. Gösterdiğiniz gibi, R ve libfoo arasındaki tüm veri alışverişi, SEXP'leri içeri ve dışarı kopyalayarak gerçekleşir. Kütüphane tarafından tahsis edilen tüm nesneler bir foo_free() çağrısı ile serbest bırakılır. – user151410