我看到了源头,但仍无法完全解释差异:
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
反之亦然,那将是很好的.
zend_string
是参考计数.这意味着多个地方zend_string
只需通过递增其引用计数即可使用相同的地方.这是使用要么完成了zend_string_copy
或zend_string_addref
.
该zend_string_release
函数是您希望在绝大多数情况下使用的函数,它将减少引用计数.如果碰巧你是字符串的最后一个用户(即refcount现在为零),那么字符串将被释放.
该zend_string_free
函数是对已经知道您是唯一使用该字符串的情况的优化.它将直接释放字符串,而不首先检查引用计数(断言仅用于调试,它在发布版本中不存在).
如有疑问,请使用zend_string_release
.