现在我重新读取了
writing R extensions多次垃圾回收的内容,仍然不明白这两个用法之间的区别:
SEXP var = PROTECT(allocVector(STRSXP,100));
VS
SEXP var; PROTECT(var = allocVector(STRSXP,100));
到目前为止,我第一次遇到了更糟糕的运气,因为我的会话有时会崩溃(但是我在实际代码和简介指南本身中都看到这种用法).有人可以解释这两个作业的区别吗?
编辑:
经过一些实验,我想我得出的结论是,上述两者之间没有区别,任何碰撞行为的差异,我认为是偶然的,但会感谢有经验的人的确认.
解决方法
这是完全相同的.这是PROTECT所调用的函数(从
https://svn.r-project.org/R/trunk/src/main/memory.c开始)
SEXP protect(SEXP s) { if (R_PPStackTop >= R_PPStackSize) R_signal_protect_error(); R_PPStack[R_PPStackTop++] = CHK(s); return s; } static R_INLINE SEXP CHK(SEXP x) { /* **** NULL check because of R_CurrentExpr */ if (x != NULL && TYPEOF(x) == FREESXP) error("unprotected object (%p) encountered (was %s)",x,sexptype2char(OLDTYPE(x))); return x; } #else #define CHK(x) x #endif
和from.include / Rinternals.h:
#define TYPEOF(x) ((x)->sxpinfo.type)
可以看到,指针参数不变地返回,所以
var = PROTECT(p) PROTECT(var = p)
是等同的