如何在将对象传递给C/C++;? 在R对象的垃圾收集时遇到一些麻烦,当将对象传递给C++时,

如何在将对象传递给C/C++;? 在R对象的垃圾收集时遇到一些麻烦,当将对象传递给C++时,,c++,r,C++,R,我们有以下情况: 在R中创建匿名函数,并将其传递给C++代码(通过 C++代码存储R函数对象以供以后使用(作为性感> 类型)并返回 以后,其他C++代码使用 RyTyEyValuy()< /COD> < /LI>调用R函数对象 在步骤2和步骤3之间,R函数对象似乎被R垃圾收集。这会导致崩溃,因为R\u tryEval()尝试执行不再代表有效R函数对象的内容。这是公平的,因为我们没有做任何事情来告诉R函数对象仍在使用中 考虑到这一点: 是否有一种方法,从C++代码中,将R函数对象标记为正在使用

我们有以下情况:

  • 在R中创建匿名函数,并将其传递给C++代码(通过<代码> C++代码存储R函数对象以供以后使用(作为<代码>性感> <代码>类型)并返回
  • 以后,其他C++代码使用<代码> RyTyEyValuy()< /COD> < /LI>调用R函数对象 在步骤2和步骤3之间,R函数对象似乎被R垃圾收集。这会导致崩溃,因为
    R\u tryEval()
    尝试执行不再代表有效R函数对象的内容。这是公平的,因为我们没有做任何事情来告诉R函数对象仍在使用中

    考虑到这一点:

    • 是否有一种方法,从C++代码中,将R函数对象标记为正在使用(这样就不会得到GC)?
    • 或者在C++代码中有一个安全的方法复制R函数对象,在调用代码> RyTyyValuy()/<代码>?/LI>之后手动处理它。

    (据我理解,<代码>保护程序)< /> > />代码> unPoto()/<代码>宏不是这里的选项,因为那些应该在同一范围内平衡。如在,当函数首次被传递到C++时,我们不能调用<代码>(或代码>),然后在执行后调用“<代码> un保护器”(< /代码>)。我想你在找

    /* preserve objects across GCs */
    void R_PreserveObject(SEXP);
    void R_ReleaseObject(SEXP);
    

    在R_internals.h标题中。

    如何“存储”对象?我认为(实际上没有考虑)可以使用外部指针。如果没有,您可以简单地将它保存在R中的某个地方,并在需要时使用findVar来回忆它。@Jeff--谢谢。您所描述的与我们设计的工作环境非常接近:在R端将函数对象添加到列表中,然后将它们传递给C++。(顺便说一句,我们很乐意继续这样做……只是想确保没有我们应该调用的“官方”函数来将对象标记为“不gc”)。就黑客而言,这可能会带来麻烦。即使您不使用Rcpp,也请参阅Martin的答案以获得适当的解决方案。。。。如果您使用Rcpp,这将自动应用于您的对象。