在 R 侧赋值 Rcpp::XPtr

Assigning Rcpp::XPtr on the R side

我正在 Rcpp 学习外部指针,XPtr。我做了以下测试功能:

// [[Rcpp::export]]
Rcpp::XPtr<arma::Mat<int>> create_xptr(int i, int j) {
  arma::Mat<int>* ptr(new arma::Mat<int>(i, j));
  Rcpp::XPtr<arma::Mat<int>> p(ptr, true);
  return p;
}

// [[Rcpp::export]]
void fill_xptr(Rcpp::XPtr<arma::Mat<int>>& xptr, int k) {
  (*xptr).fill(k);
}

// [[Rcpp::export]]
arma::Mat<int> return_val(Rcpp::XPtr<arma::Mat<int>>& xptr) {
  return *xptr;
}

现在在 R 方面,我当然可以创建一个实例并使用它:

x <- create_xptr(1000, 1000) # (1)

说,由于某种原因我不小心再次调用了create_xptr并将结果分配给x,即

x <- create_xptr(1000, 1000) # (2)

然后,我无法再访问我在 (1) 中创建的指针,这是有道理的,因此,我无法释放内存。我想要的是,第二次 (2) 它只是覆盖第一次 (1)。其次,如果我在某个本地范围内创建一个外部指针(比如一个简单的 for 循环),那么当它超出范围时,是否应该自动释放所使用的内存?我试过以下方法:

for (i in 1:3) {
  a <- create_xptr(1000, 100000)
  fill_xptr(a, 1)
}

但它只是增加了每个 i 的内存使用量。

我尝试阅读不同 git-repos 上的一些代码,堆栈上的旧帖子阅读了一些关于 R 中的终结器和垃圾收集的内容。我似乎无法拼出拼图。

我们将外部指针用于 尚不存在接口 的事物,例如数据库连接或来自其他新库的对象。你可能最好看看 XPtr 的一些现有用途(或其他一些包中的其他外部指针变体,CRAN 上有两个小的)。

而且我想我想不出一个在 R 中直接引用它的示例。它主要用于“包装”外部对象以保留它们并将它们传递到其他地方以供进一步使用。你是对的,你需要阅读一些关于终结器的知识。我发现阅读 Writing R Extensions 是最好的来源,尽管它很密集,因为你需要先掌握 C 语言的初始“基础知识”。