php7 zend扩展名:堆栈变量的refcount?

时间:2016-07-12 20:19:41

标签: php c php-internals

在php7的以下代码中引用计数会发生什么? 在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?
}

2 个答案:

答案 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_stringzend_array) zval指向。 zval本身没有引用数据。