On 10 November 2014 at 16:51, Claymore Marshall wrote:
| Thank you for the feedback Dirk.  Fair enough.
| 
| I think the issue I have is similar to this (I want to set  StoragePolicy =
| false for the XPtr), so I sort of have a work around going: http://
| lists.r-forge.r-project.org/pipermail/rcpp-devel/2013-February/005273.html
| 
| I would like 'res' to be a 'non-owning' reference pointer in R to A in B.  I
| don't know how this could be done directly (or if it's possible) with a
| .finalizer ... do you mind elaborating a little?  (The Rcpp module vignette is
| very brief on .finalizer).  Or are there any examples anywhere that 
demonstrate
| what you mean?

Yes, sorry -- I have no personal example I can think of or I would have sent
it along.  (I was happy noodling around issue with modules this weekend, more
on that another time.)

Maybe if the memory management issue is paramount, do something else and
manually manage on the C++ side and just give out less 'explosive' XPtr?  A
bit hard to say in the abstract...

Cheers,  Dirk

 
| Thanks again.
| 
| 
| On Mon, Nov 10, 2014 at 1:45 PM, Dirk Eddelbuettel <e...@debian.org> wrote:
| 
| 
|     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 | e...@debian.org
| 
| 

-- 
http://dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org
_______________________________________________
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

Reply via email to