PROTECT应该包含什么作业?

现在我重新读取了 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)

是等同的

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...