Rcpp:包装类是保存Xptr指向的基本类型的唯一方法吗?

时间:2017-06-14 17:40:04

标签: c++ r pointers rcpp

我对R有相当多的经验,但我现在才开始学习C ++,所以我请求原谅任何随之而来的愚蠢....

给出以下test.cpp文件:

#include <Rcpp.h>
#include <string>
using namespace Rcpp;
using namespace std;

XPtr< double > getPtr(NumericVector x) {
  double i;
  i = REAL(x)[0];
  XPtr< double > p(&i, false);
  XPtr<double> checkP(p);
  double checkV = *checkP;
  cout << "Values within getPtr scope:" << endl;
  cout << "Pointer address " << hex << checkP << endl;
  cout << "Pointer value " << checkV << endl;
  return p;
}

// [[Rcpp::export]]
void testPtr(NumericVector x){ 
  XPtr<double> p(getPtr(x));
  cout << "Values outside of getPtr scope:" << endl;
  cout << "Pointer address " << hex << p << endl;
  cout << "Pointer value " << *p << endl;
  return;
}

以下R片段演示了Xptr&#34;指向的值消失了#34;在getPtr函数之外。

> library(Rcpp)
> Rcpp::sourceCpp(file="test.cpp")
> 
> test <- c(35,28,16,52)
> testPtr(test)
Values within getPtr scope:
Pointer address 0x7ffd3763d790
Pointer value 35
Values outside of getPtr scope:
Pointer address 0x7ffd3763d790
Pointer value 6.95277e-310

但当然!由于该值超出范围,因此这是预期的行为。

或者,如果我将值包装在类中并使用new,则该对象仍然存在,并且我可以在被调用函数的范围之外检索我的值:

class Wrap {
public:
  Wrap(double x) {
    i = x;
  }
  double i;
};

XPtr< Wrap > getPtrW(NumericVector x) {
  double i;
  i = REAL(x)[0];
  Wrap* w = new Wrap(i);
  XPtr< Wrap > p(w, true);
  return p;
}

// [[Rcpp::export]]
void testWrappedPtr(NumericVector x){ 
  XPtr<Wrap> wp(getPtrW(x));
  Wrap w = *(wp);
  cout << "Wrapped value " << w.i << endl;
  return;
}

然后,这表明该值仍然存在:

> testWrappedPtr(test)
Wrapped value 35

我的问题(最后)是这些:(1)这是否(即包装在一个类中)是唯一的方法来挂起基本类型的变量值而不是malloc&d; d或new&#39; d和(2)如果没有,是任何替代方式&#34;更好&#34;或&#34;首选&#34;?

提前致谢!

0 个答案:

没有答案