zend_string_release和zend_string_free有什么区别?

mar*_*cio 3 c php-internals

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

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

如果有一个zend_string_free更合适的实例,zend_string_release反之亦然,那将是很好的.

Nik*_*kiC 7

zend_string是参考计数.这意味着多个地方zend_string只需通过递增其引用计数即可使用相同的地方.这是使用要么完成了zend_string_copyzend_string_addref.

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

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

如有疑问,请使用zend_string_release.