此页面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的垃圾回收器运行,则使用PROTECT
和UNPROTECT
调用来阻止SEXP对象被删除,则示例代码不正确。如果此处的C代码在UNPROTECT
调用和最终的return语句之间被抢占,那么result
仍将在从函数返回之前被删除。
在C代码运行时,保护在C api函数中分配的SEXP值免受垃圾回收的正确方法是什么?