zend_string_release 和 zend_string_free 有什么区别?
What's the difference between zend_string_release and zend_string_free?
我看到了 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_free
比 zend_string_release
更合适,反之亦然。
zend_string
s 是引用计数。这意味着多个地方可以简单地通过增加其引用计数来使用相同的 zend_string
。这是使用 zend_string_copy
或 zend_string_addref
.
完成的
zend_string_release
函数是您在绝大多数情况下要使用的函数,它会减少引用计数。如果碰巧您是该字符串的最后一个用户(即引用计数现在为零),该字符串将被释放。
zend_string_free
函数是针对您已经知道 您是唯一使用该字符串的情况的优化。它将直接释放字符串,而不首先检查引用计数(断言仅用于调试,它不存在于发布版本中)。
如有疑问,请使用zend_string_release
。
我看到了 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_free
比 zend_string_release
更合适,反之亦然。
zend_string
s 是引用计数。这意味着多个地方可以简单地通过增加其引用计数来使用相同的 zend_string
。这是使用 zend_string_copy
或 zend_string_addref
.
zend_string_release
函数是您在绝大多数情况下要使用的函数,它会减少引用计数。如果碰巧您是该字符串的最后一个用户(即引用计数现在为零),该字符串将被释放。
zend_string_free
函数是针对您已经知道 您是唯一使用该字符串的情况的优化。它将直接释放字符串,而不首先检查引用计数(断言仅用于调试,它不存在于发布版本中)。
如有疑问,请使用zend_string_release
。