小编Luc*_* Hu的帖子

当外部程序通过 R 的 C API 接口调用 `Rf_allocXXX` 时,谁在管理内存?

我正在用 Rust 编写一个 R 包,它通过其 C API 接口与 R 通信。

一个对我来说似乎很棘手的基本问题是内存管理。

所以首先让我简要解释一下我的 Rust 程序如何与 R 通信。


首先,在 R 端,它使用.Call(). 然后将 C 库链接到具有 C 兼容 ABI 的 Rust 静态库。

R 脚本正在做一些简单的工作,比如输入验证,并根据输入决定调用哪个 C 函数。然后 C 程序将调用传递给底层 Rust 函数,这些函数作为 C 兼容函数公开。

到目前为止很清楚,一旦 Rust 完成计算并需要将结果发回,它就会变得棘手。


一种选择是直接调用Rf_allocXXXRust 端的函数,并将结果存储在其中。然后将 R 对象的原始指针传递回 C,然后传递给 R。

但我不清楚,这是否会导致内存泄漏

在我看来,如果 Rust 调用Rf_allocXXX,新的 R 对象 ( SEXP) 将在 Rust 程序的堆内存上创建。当传递原始指针时,Rust 不会销毁对象。但是接下来会发生什么?

注意,SEXPRust 以这种方式创建的 被直接传回给 C 和 R。没有重新分配。所以我似乎很不清楚这是否SEXP会被 R 的 …

r rcpp

2
推荐指数
1
解决办法
100
查看次数

标签 统计

r ×1

rcpp ×1