如何解决Rcpp:如果我投射到/从 SEXP 投射,对象是否受到安全保护?
在 C 或 C++ 中创建 R 扩展时,在编译代码中创建的对象需要手动保护和不受垃圾收集器保护 - 例如:
SEXP some_func(SEXP inp)
{
SEXP some_vec = PROTECT(Rf_allocVector(REALSXP,100));
// do something with 'some_vec' ...
UNPROTECT(1);
return some_vec;
}
Rcpp OTOH 提供了方便的类,可以自动处理 PROTECT
和 UNPROTECT
调用,因此可以安全地执行以下操作:
Rcpp::NumericVector some_func(SEXP inp)
{
Rcpp::NumericVector some_vec(100);
// do something with 'some_vec' ...
return some_vec;
}
现在,如果我将 Rcpp 对象强制转换为通用 SEXP,它们是否仍然是自动保护的?示例:
SEXP some_func(SEXP inp)
{
SEXP some_vec = Rcpp::NumericVector(100);
// do something with 'some_vec' ...
return some_vec;
}
由于 some_vec
被分配为专门的 NumericVector
但随后被转换为 SEXP
,它是否仍会自动进行 PROTECT
/UNPROTECT
,或者我是否需要手动完成?
那反过来呢?例如。这样安全吗?
Rcpp::NumericVector some_func(SEXP inp)
{
Rcpp::NumericVector some_vec = Rf_allocVector(REALSXP,100);
// do something with 'some_vec' ...
return some_vec;
}
解决方法
是的,因为 R 的唯一接口使用 SEXP .Call(SEXP ...)
。所以每个 Rcpp 对象都会自动转换(很多隐式转换,但也通过 Rcpp::wrap(...)
),保护是其中的一部分。
您可以通过一次没有保护层手动创建 SEXP
来轻松验证这一点,R 会在 R CMD check
和/或崩溃时告诉您。
由此您可以得出结论,Rcpp 对象受到了正确的保护,因为它们不会发生这种情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。