如何在将对象传递给C/C++时禁止R垃圾回收?

qet*_*anm 11 c++ r

在将对象传递给C++时,遇到R的垃圾收集问题.

我们有以下场景:

  1. 我们在R中创建一个匿名函数,并将其传递给C++代码(通过.Call())
  2. C++代码存储R函数对象供以后使用(作为SEXP类型)并返回
  3. 稍后,其他一些C++代码使用调用R函数对象 R_tryEval()

在步骤2和3之间,R函数对象似乎被R垃圾收集.这会导致崩溃,因为R_tryEval()尝试执行不再表示有效R函数对象的事物.这是公平的,因为我们没有做任何事情来告诉R功能对象仍在使用中......

考虑到这一点:

  • 有没有办法,从C++代码,将R函数对象标记为正在使用(这样它不会得到gc'd)?
  • 或者是否有一种安全的方法来复制R函数对象,在C++代码中,并在我们调用后手动处理它R_tryEval()

(据我所知,PROTECT()/ UNPROTECT()宏在这里不是一个选项,因为它们应该在同一范围内进行平衡.因为,PROTECT()当函数首次传递给C++然后稍后调用UNPROTECT()之后我们就无法调用已被执行.)

Mar*_*gan 3

我想你正在寻找

/* preserve objects across GCs */
void R_PreserveObject(SEXP);
void R_ReleaseObject(SEXP);
Run Code Online (Sandbox Code Playgroud)

在 R_internals.h 标头中。