在 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 语言的初始“基础知识”。
我正在 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 语言的初始“基础知识”。