微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.jb51.cc/c/115801.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐