什么应该保护PROTECT包装?

时间:2013-10-22 16:46:37

标签: c r internals

我现在多次重新阅读writing R extensions中有关垃圾收集的内容,但仍然不明白这两种用法之间的区别:

SEXP var = PROTECT(allocVector(STRSXP, 100));

VS

SEXP var;
PROTECT(var = allocVector(STRSXP, 100));

到目前为止,由于我的会话有时会崩溃,所以我的第一个运气运气不佳(但我在实际代码和介绍指南中看到了很多用法)。有人可以解释这两个任务之间的区别吗?

修改

经过一些实验后,我认为我得出的结论是,上述两者之间没有任何区别,我认为崩溃行为的任何差异都是偶然的,但我希望得到更有经验的人的确认。

1 个答案:

答案 0 :(得分:7)

它完全相同。这是由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)

等同于