2016-07-12 55 views
0

下面的代码为php7引用计数会发生什么? 在PHP7 zval s的栈上创建的,所以引用问题就出来了:php7 zend扩展:refcount为堆栈变量?

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? 
} 
+1

很难说没有更具体的代码,但通常这是好的。 val的值被复制到数组中,所以如果'val'变量超出范围就无关紧要了。 – NikiC

回答

0

我相信它被复制。如果您在这里使用zval来保存自定义类实例,则需要您的类的复制构造函数来编译此代码。

我认为当你用PHP编程而不是C时,会发生自动RC。你必须使用指针来利用这个级别的引用。

如果您深入了解编写PHP扩展,您会发现实际上,Zend引擎会问您如何处理RC和原始(客观)zval,同时将其返回给PHP(第二个和第三个参数RETURN_ZVAL())。如果你不仔细处理它们,可能会有内存泄漏(在调试模式ZE会告诉你这个!)甚至是段错误。

0

在PHP 7中,zvals没有被引用,只有它们的值。

如果zval包含非refcounted类型(null,booleans,integer,float),那么PHP将简单地复制zval。如果zval包含refcounted类型(字符串,数组,对象,资源和引用),则PHP将复制zval并将zval指向的值的引用计数(例如zend_stringzend_array)增加到。 zval本身没有refcount。