On Mar 6, 2014, at 5:32 PM, Saptarshi Guha <saptarshi.g...@gmail.com> wrote:
> Hello, > > This is a question that probably reveals my lack of understanding. > In a C function (call it cfunc), i created a SEXP, called S, and then > called R_PreserveObject on S. > > I returned the SEXP to the calling R function (call it rfunc). Note, I > didn't call > R_ReleaseObject on S. > > v <- .Call("cfunc") > > So, are the following statements correct > > 1. S is 'doubly' protected from the GC by being associated both with 'v' > and because it has been added to the precious list (via a call to > R_PreserveObject without ReleaseObject being called) > yes > 2. I have another C function called cfunc2. In cfunc2, I call > R_ReleaseObject on S. S , however, is still protected from the GC, because > it is associated with 'v' > yes (assuming the binding to v still exists at that point). Note, however, that is such a case you R_PreserveObject() is pointless since you don't need to protect it on exit (that's in fact the convention - return results are never protected). > Is (1) and (2) correct? > > I have not used R_protect/unprotect, because if I return from cfunc without > the equivalent number of unprotects, i get 'unbalanced stack' warnings. I'd > rather not have to worry about that because i intend to balance it later. > Normally, you should not keep the result of a function protected since it means you *have* to guarantee the unprotect at a later point. That is in general impossible to guarantee unless you have another object that is holding a reference that will be cleared by an explicitly registered finalizer. So unless that is the case, you are creating an explicit leak = bad. If you don't have as stack-like design, you can always use explicitly managed object for the lifetime (personally, I prefer that) since all chained objects are protected by design, or use REPROTECT. Cheers, Simon > Regards > Saptarshi > > [[alternative HTML version deleted]] > > ______________________________________________ > R-devel@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel