[Rcpp-devel] Rcpp modules and return_value_policy for exposed C++ member functions

Dirk Eddelbuettel edd at debian.org
Mon Nov 10 19:45:37 CET 2014


On 10 November 2014 at 13:16, Claymore Marshall wrote:
| I want to expose to R several C++ classes from a library with Rcpp modules. 
| I'm trying to imitate a similar set of Python modules that were made for the
| same library.
| 
| In Boost.Python, with .def it is possible to specify the return_value_policy. 
| Is it also possible to do this in a straight forward way with Rcpp modules when
| exposing C++ class methods?
| 
| The following simplified example illustrates a problem I face with using Rcpp
| modules.  When R deletes 'res', R crashes shortly after (a segfault?).  
| 
| With a Python module, this kind of problem apparently doesn't come about by
| setting in .def the following: return_value_policy<reference_existing_object>()
|  
| 
| Is there an easy way to get around this problem with Rcpp modules with minimal
| code?
| 
| #include <Rcpp.h>
| using namespace Rcpp;
| 
| class A {
| 
|   public:
|     
|     A(int x_) : x(x_){}
| 
|     int x;
| };
| 
| class B {
|   
|   public:
|     B():m_A(10) {}
|   
|     A get_an_A(){
|       A an_A(3);
|       return an_A;
|     }
|     A * get_member_A() { return & m_A; }
|       
|   private:
|     A m_A;
| };
| 
| RCPP_EXPOSED_CLASS(A)
| RCPP_EXPOSED_CLASS(B)
| 
| RCPP_MODULE(AB_mod){
|   using namespace Rcpp ;
|   class_<A>("A")
|    .constructor<int>()
|    .field("x", &A::x)
|   ;
|   class_<B>("B")
|    .constructor()
|    .method("get_an_A",&B::get_an_A)
|    .method("get_member_A", &B::get_member_A)
|   ;
| }
| 
| 
| 
| ------------------------
| 
| R code:
| 
| A_eg <- new(A, 10)
| B_eg <- new(B) 
| 
| res <- B_eg$get_member_A()
| 
| rm(res)
| # R crashes shortly after running further commands ...
| # How can this error be prevented?

By not removing res?  

By adding a finalizer / destructor for it?

I don't use modules for things I add / remove frequently from the heap. I
generally just create an object "and keep it".  That usage works for me.

Dirk

-- 
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org


More information about the Rcpp-devel mailing list