Hello Everybody, I am trying to create tree data structure using C++ and Rcpp and use it from R. I want to incrementally build the tree by merging a tree with other tress. So, I created a class for the tree and a class for the nodes in the tree. The tree class has two constructors, the first one simply creates a tree with a single leaf. The second constructor takes two external pointers pointing to two trees and creates a new tree be joining the two trees with a new node. In the R side I create a tree (tree1) and repeatedly add another tree (tree2) in the first tree. Here is the C++ and R code.
#include <Rcpp.h> class treeNode { public: treeNode* left; treeNode* right; }; class tree { private: treeNode* root; public: tree(); tree(SEXP, SEXP); SEXP getPointer(); void addTree(SEXP ptr2); }; tree::tree() { root = new treeNode; root->left = NULL; root->right = NULL; } // merge two tree and create a new tree tree::tree(SEXP ptr1, SEXP ptr2) { Rcpp::XPtr<tree> tree1(ptr1); Rcpp::XPtr<tree> tree2(ptr2); root = new treeNode; root->left = tree1->root; root->right = tree2->root; } SEXP tree::getPointer() { Rcpp::XPtr<tree> ptr(this, true); return ptr; } RCPP_MODULE(yada){ using namespace Rcpp ; class_<tree>("tree") .constructor() .constructor<SEXP, SEXP>("create a new tree by merging two existing trees") .method("getPointer", &tree::getPointer, "getPointer") ; } I created a package called test and then call the functions from R side The R code looks like the following: require(test) t1 = new(tree) t2 = new(tree) t1 = new(tree, t1$getPointer(), t2$getPointer()) gc() t2 = new(tree) t1 = new(tree, t1$getPointer(), t2$getPointer()) gc() After second garbage collector call I am getting segmentation fault . Can you please explain the right way to program this scenario? In particular, when a C++ object is still used by another object through pointer how can I prevent R garbage collector removing the object ? Thanks Ariful Azad
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel