[Rcpp-devel] Rcpp and ExternalPtr
Romain François
romain at r-enthusiasts.com
Fri Dec 5 09:54:46 CET 2014
You are looking for XPtr. https://github.com/RcppCore/Rcpp/blob/master/inst/include/Rcpp/XPtr.h
It is a template class whose first parameter is the class of the raw pointer you are dealing with, let’s call it T.
You can create an external pointer using something like :
XPtr<T> xp( new T(...) ) ;
This registers the default finalizer (which calls delete) to be executed when R garbage collects the R object. So you can send xp back to the R side.
Then you can grab it back on the C++ side, e.g. as a parameter to a function:
// [[Rcpp::export]]
void foo( XPtr<T> xp ){
// here you can treat xp as a raw pointer, e.g. do xp->foo( ... ) ;
}
You can also set the finalizer yourself with a bit more work if you wanted to do something different than the default, e.g.
void my_finalizer( T* obj ){
// whatever you need to do
}
typedef XPtr<T, PreserveStorage, my_finalizer> Bar ;
If you deal with a pointer that you don’t own, i.e. you don’t handle its finalization for some reason, you can set the second parameter of the XPtr constructor from https://github.com/RcppCore/Rcpp/blob/master/inst/include/Rcpp/XPtr.h#L84
XPtr<T> xp( raw_ptr, false ) ;
Romain
> Le 5 déc. 2014 à 08:45, Jeroen Ooms <jeroen.ooms at stat.ucla.edu> a écrit :
>
> Does Rcpp provide some elegant way to let the R user manage persistent
> c++ objects that have no R type (e.g. internal handles or sessions of
> some sort)?
>
> In C, I would use R_MakeExternalPtr to create a ptr SEXP that the user
> can pass from one R function to another. This also makes it easy to
> add a finalizer with R_RegisterCFinalizerEx so that the garbage
> collector will automatically clean up the session/handle whenever user
> deletes the R object.
>
> Most Rcpp examples I have seen use function arguments with standard
> data types that are automatically mapped to R types. Does Rcpp have
> any special mechanics for managing external objects (pointers) from R
> which do not map to a SEXP type? Or do I have to fall back on
> Rinternals for this?
> _______________________________________________
> Rcpp-devel mailing list
> Rcpp-devel at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel
More information about the Rcpp-devel
mailing list