zend_string_release和zend_string_free之间的区别是什么?

时间:2015-01-20 00:06:11

标签: c php-internals

我看到了source,但仍无法完全解释差异:

static zend_always_inline void zend_string_free(zend_string *s)
{
    if (!IS_INTERNED(s)) {
        ZEND_ASSERT(GC_REFCOUNT(s) <= 1);
        pefree(s, GC_FLAGS(s) & IS_STR_PERSISTENT);
    }
}

static zend_always_inline void zend_string_release(zend_string *s)
{
    if (!IS_INTERNED(s)) {
        if (--GC_REFCOUNT(s) == 0) {
            pefree(s, GC_FLAGS(s) & IS_STR_PERSISTENT);
        }
    }
}

编辑:

很高兴有一个实用的例子,其中zend_string_freezend_string_release更合适,反之亦然。

1 个答案:

答案 0 :(得分:7)

zend_string被引用计算。这意味着只需增加其引用计数,多个地方就可以使用相同的zend_string。这是使用zend_string_copyzend_string_addref完成的。

zend_string_release函数,您希望在绝大多数情况下使用它,将减少引用计数。如果碰巧你是字符串的最后一个用户(即refcount现在为零),那么该字符串将被释放。

zend_string_free功能是针对您已经知道您是唯一使用该字符串的情况的优化。它将直接释放字符串,而不首先检查引用计数(断言仅用于调试,它在发布版本中不存在)。

如有疑问,请使用zend_string_release