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?
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20141110/3e9149e9/attachment.html>
[Rcpp-devel] Rcpp modules and return_value_policy for exposed C++ member functions
4 messages · Claymore Marshall, Dirk Eddelbuettel
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
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 <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? Thanks again.
On Mon, Nov 10, 2014 at 1:45 PM, Dirk Eddelbuettel <edd at 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 | edd at debian.org
-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.r-forge.r-project.org/pipermail/rcpp-devel/attachments/20141110/10d0e99f/attachment.html>
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 <edd at 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 | edd at debian.org
|
|
http://dirk.eddelbuettel.com | @eddelbuettel | edd at debian.org