在php7的以下c代码中引用计数会发生什么?
在php7中zval
是在堆栈上创建的,因此会出现参考问题:
zval destination;
array_init(destination);
{
// scope begin
zval val;
// does val's refcount incremented here or val is copied?
add_next_index_zval(destination, val);
// here the "val" will be destroyed.
// Does "destination" will experience any problems?
}
答案 0 :(得分:0)
我相信它被复制了。如果您使用此处的zval
来保存自定义类实例,则您的类需要一个复制构造函数来编译此代码。
我认为当你用PHP而不是C编程时会发生自动RC。你必须使用指针来利用这个级别的引用。
如果你详细了解如何编写PHP扩展,你会发现实际上Zend引擎会询问你如何使用RC和原始(目标)zval,同时将它返回给PHP(第二个和RETURN_ZVAL()
)的第三个参数。如果你不小心处理它们,可能会有内存泄漏(在调试模式下ZE会告诉你这个!)甚至是段错误。
答案 1 :(得分:0)
在PHP 7中,没有引用zval,只引用它们的值。
如果zval包含非refcounted类型(null,booleans,整数,浮点数),那么PHP将只复制zval。
如果zval包含refcounted类型(字符串,数组,对象,资源和引用),那么PHP将复制zval并递增值的引用计数(例如zend_string
或zend_array
) zval指向。 zval本身没有引用数据。