Rcpp模块中的成员已损坏

时间:2013-11-29 15:14:19

标签: rcpp

我有一个类和一个指向c ++中类实例的指针向量。我希望能够使用Rcpp查询R中的两种对象。但是,我班级的数据成员似乎无缘无故地被破坏了。由于我无法一致地重现错误,因此我猜测它与释放的内存有关,而不应该有。

我也尝试过设计自己的容器类,但遇到了同样的问题。

下面我尝试制作一个最小的例子

#include <Rcpp.h>
using namespace Rcpp;

class Element{
  private:
    int x;
  public:
    Element() : x(0){};
    Element(int x_) : x(x_){};
    void display() {Rcpp::Rcout << x << std::endl;}
};

typedef std::vector<Element*> Container;

RCPP_EXPOSED_CLASS(Element)

//R Side

RCPP_MODULE(mod){
  class_<Element>("Element")
    .constructor<int>()
    .method("display", & Element::display);


  class_<Container>("Container")
    .constructor()
    .constructor<int>()
    .method("push_back", & Container::push_back)
    .const_method("at", & Container::at )
    .const_method("size", & Container::size )
  ;
}

/*** R
container <- new(Container)

container$push_back( new(Element, 5))
container$push_back( new(Element, 6))

container$size()

myElements <- list()
myElements[[1]] <- container$at(0)
myElements[[1]]$display()
*/

我不得不在R中再查询几次以获得下面的错误是我的输出

> Rcpp::sourceCpp('src/Element.cpp')
> container <- new(Container)
> container$push_back( new(Element, 5))
> container$push_back( new(Element, 6))
> container$size()
[1] 2
> myElements <- list()
> myElements[[1]] <- container$at(0)
> myElements[[1]]$display()
5
> myElements[[2]] <- container$at(1)
> myElements[[1]]$display()
5
> myElements[[2]]$display()
6
> myElements[[1]]$display()
61412608

编辑: 在添加两个函数

之后,我能够在Windows环境中编译它
Element* container_at(std::vector<Element*> * vec, int i){
  return vec->at(i);
}

int container_size(std::vector<Element*> * vec){
  return vec->size();
}

并替换

.const_method("at", & Container::at )
.const_method("size", & Container::size )

.method("at", & container_at )
.method("size", & container_size )

1 个答案:

答案 0 :(得分:0)

这是一个错误。你能在这里记录:https://github.com/RcppCore/Rcpp/issues?state=open

我很清楚它可能是什么以及如何修复它,但我可能没有时间待几天。