[Rcpp-devel] gc() calls destructor twice when both class and XPtr deleted

Michael Shvartsman mshvarts at umich.edu
Mon Feb 11 18:16:13 CET 2013


Hi Rcpp-devel -

     In some of my code, I return an XPtr pointing to one C++ class 
(e.g. class A) to the R side, and then pass it back down to the C++ side 
in the constructor of another class (e.g. class B, which needs access to 
some methods in class A). If I rm() both class A and the pointer to it 
on the R side (or they otherwise both go out of scope), then the garbage 
collector calls the destructor of class A twice and attempts to free the 
memory twice.

     Happens on OSX and Ubuntu with latest R and Rcpp. Is this intended 
behavior? If yes, what's a recommended workaround? I can go into more 
detail on why this is useful to my workflow if needed. Below is a 
minimal example. Best,

         Mike Shvartsman.

-----
library(Rcpp)
library(inline)

inc <- '
using namespace Rcpp;
class A{
     public:
         A();
         ~A();
         XPtr<A> getPtr();
};

XPtr<A> A::getPtr(){
     return(XPtr<A>(this));
}

A::A(){
     Rcout << "CTOR" << std::endl;
}

A::~A(){
     Rcout << "DTOR" << std::endl;
}

RCPP_MODULE(mod){
     class_<A>("A")
     .constructor()
     .method("getPtr", &A::getPtr)
     ;
}
'

func <- cxxfunction(signature(), include=inc, plugin='Rcpp')

mod <- Module('mod', getDynLib(func))


A <- mod$A

a <- new(A)
aPtr <- a$getPtr()
rm(a)
rm(aPtr)
gc()
-----



More information about the Rcpp-devel mailing list