我正在用 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 的 …