У меня есть класс и вектор указателей на экземпляры класса в 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)
Я получаю несколько экранов с предупреждениями при компиляции кода (в Windows). В Linux это просто не удается. «Минимальные воспроизводимые примеры», пожалуйста. –
@Dirk Я только что скопировал вышеуказанный код в новый .cpp-файл. И я был полностью в состоянии запустить его в R с терминала. Я работаю на Linux. –
Какая версия Rcpp, какая версия R, версия G ++, ...? Это провалилось для меня на Ubuntu 13.04, все текущее, как выпущено. –