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

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


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

到目前为止,我的第一个运气不好,因为我的 session 有时会崩溃(但是我在实际代码和入门指南本身中都看到了很多用法)。有人可以解释这两个作业之间的区别吗?

编辑:

经过一些实验,我认为我得出的结论是,以上两者之间没有区别,并且我认为碰撞行为的任何差异都是偶然的,但是希望有经验的人对此进行确认。

最佳答案

这是严格等效的。这是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 - PROTECT在分配时究竟应该包装什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19523732/

10-12 20:48