在将对象传递给C++时,遇到R的垃圾收集问题.
我们有以下场景:
.Call())SEXP类型)并返回R_tryEval()在步骤2和3之间,R函数对象似乎被R垃圾收集.这会导致崩溃,因为R_tryEval()尝试执行不再表示有效R函数对象的事物.这是公平的,因为我们没有做任何事情来告诉R功能对象仍在使用中......
考虑到这一点:
R_tryEval()?(据我所知,PROTECT()/ UNPROTECT()宏在这里不是一个选项,因为它们应该在同一范围内进行平衡.因为,PROTECT()当函数首次传递给C++然后稍后调用UNPROTECT()之后我们就无法调用已被执行.)
我想你正在寻找
/* preserve objects across GCs */
void R_PreserveObject(SEXP);
void R_ReleaseObject(SEXP);
Run Code Online (Sandbox Code Playgroud)
在 R_internals.h 标头中。