在R的C api函数中正确使用PROTECT和UNPROTECT调用

时间:2019-03-03 20:14:35

标签: r

此页面http://adv-r.had.co.nz/C-interface.html

  

如果您不保护创建的每个R对象,则垃圾收集器会认为它们未使用并删除它们

它还提供了示例代码

SEXP result = PROTECT(allocVector(REALSXP, 1));
REAL(result)[0] = asReal(a) + asReal(b);
UNPROTECT(1);

return result;

如果如果您的C代码被抢占并且R的垃圾回收器运行,则使用PROTECTUNPROTECT调用来阻止SEXP对象被删除,则示例代码不正确。如果此处的C代码在UNPROTECT调用和最终的return语句之间被抢占,那么result仍将在从函数返回之前被删除。

在C代码运行时,保护在C api函数中分配的SEXP值免受垃圾回收的正确方法是什么?

0 个答案:

没有答案