2013-11-29 2 views
2

У меня есть класс и вектор указателей на экземпляры класса в C++. Я хочу иметь возможность запрашивать оба типа объектов в R, используя Rcpp. Однако член данных моего класса, похоже, поврежден без причины. Поскольку я не могу последовательно воспроизводить ошибку, я предполагаю, что она имеет какое-то отношение к выпущенной памяти, которой не должно быть.Поврежденные члены в модуле Rcpp

Я также пробовал разработать собственный контейнерный класс, но он пострадал от той же проблемы.

Ниже я попытался сделать минимальный пример

#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 

EDIT: Я был возможность скомпилировать его в среде 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) 
+0

Я получаю несколько экранов с предупреждениями при компиляции кода (в Windows). В Linux это просто не удается. «Минимальные воспроизводимые примеры», пожалуйста. –

+0

@Dirk Я только что скопировал вышеуказанный код в новый .cpp-файл. И я был полностью в состоянии запустить его в R с терминала. Я работаю на Linux. –

+0

Какая версия Rcpp, какая версия R, версия G ++, ...? Это провалилось для меня на Ubuntu 13.04, все текущее, как выпущено. –

ответ

0

Это ошибка. Можете ли вы зарегистрировать его здесь: https://github.com/RcppCore/Rcpp/issues?state=open

У меня есть хорошее представление о том, что это может быть и как это можно исправить, но у меня может не быть времени на несколько дней.

Смежные вопросы