On Apr 14, 2010, at 7:50 AM, Dominick Samperi wrote:

> Consider the C (or C++) code called from the .Call interface:
> SEXP foo() {
>  SEXP *p = PROTECT(allocVector(REALSXP, 10));
>  ...
>  UNPROTECT(1);
>  return p;
> }
> 
> Why is there no danger that the allocated memory will be garbage
> collected after the UNPROTECT, but before the return of p?
> 
> I have used code like this for some time and have never had a
> problem, but I'm not sure if/why it is guaranteed to work.

Garbage collection is only triggered by allocation. The hard bit is to remember 
exactly which programming constructs might allocate something, but in the 
above, there aren't any. You need to watch out with the unprotected return 
value, though: fee(foo(), fum()) is a standard bug source if fum() allocates.


-- 
Peter Dalgaard
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Email: pd....@cbs.dk  Priv: pda...@gmail.com

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to