निम्न कोड में, foo_new() को कॉल के साथ प्रकार foo का ऑब्जेक्ट बनाया गया है और ऑब्जेक्ट के बाहरी-पॉइंटर को वापस लौटा दिया गया है बाद में गणना ptr_foo पास करके किया जाता है। ऑब्जेक्ट को अंततः foo_free (foo * X) के लिए एक स्पष्ट कॉल से मुक्त किया जाता है। सभी computations libfoo द्वारा किया जाता है।आर। कैल() इंटरफ़ेस और EXTPTRSXP: बाहरी आवंटित ऑब्जेक्ट्स के साथ सुरक्षा/अप्रतिबंध को समझना
क्या तथ्य यह है कि ptr_foo बनाया गया था कि foo ऑब्जेक्ट के भीतर अन्य सभी गतिशील आवंटित फ़ील्ड स्वचालित रूप से संरक्षित हैं? या, क्या यह संभव है कि "बार" जैसे क्षेत्रों को कचरा कलेक्टर द्वारा हटा दिया जा सके?
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);
}
धन्यवाद,
आरटी
धन्यवाद टॉमी। यही वह था जिसे मैं उम्मीद कर रहा था। जैसा कि आप इंगित करते हैं, आर और libfoo के बीच डेटा का सभी एक्सचेंज एसईएक्सपी को अंदर और बाहर कॉपी करके होता है। पुस्तकालय द्वारा आवंटित सभी वस्तुओं को foo_free() कॉल से मुक्त किया जाता है। – user151410