PROTECT应该包含什么作业?

前端之家收集整理的这篇文章主要介绍了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)

是等同的

原文链接:https://www.f2er.com/c/115801.html

猜你在找的C&C++相关文章