2011-08-25 55 views
1

有些东西令我困惑。假设有一个类成员 Foo::$bar,它必须被初始化为 构造函数中的空数组。如果我这样做(通过zend_update_property),其增加的计数为 (从1开始,它在alloc + array_init之后得到2)。这是 显然为什么会发生这种情况,因为从zend_update_property的角度来看,它从外部世界中的somone中获得了一个 变量,所以它适用于++它。数组作为类成员和计数

但是,在这种特殊情况下,阵列中的 构造被初始化,它不需要为2的引用次数,1是正确的,因为它仅由对象使用 (还)。

所以我想我会Z_DELREF_P()它。它的工作。直到我开始 Valgrind的,这是报告:

==4538== Invalid read of size 4 
==4538== at 0x822D3C6: _zval_ptr_dtor (zend.h:385) 
==4538== by 0x823C1FF: _zval_ptr_dtor_wrapper (zend_variables.c:189) 
==4538== by 0x824E1A1: zend_hash_destroy (zend_hash.c:529) 
==4538== by 0x826655A: zend_object_std_dtor (zend_objects.c:45) 
==4538== by 0x8266A28: zend_objects_free_object_storage 
(zend_objects.c:126) 
==4538== by 0x826C43D: zend_objects_store_del_ref_by_handle_ex 
(zend_objects_API.c:220) 
==4538== by 0x826C0AC: zend_objects_store_del_ref 
(zend_objects_API.c:172) 
==4538== by 0x823BD77: _zval_dtor_func (zend_variables.c:52) 
==4538== by 0x822B99B: _zval_dtor (zend_variables.h:35) 
==4538== by 0x822D463: _zval_ptr_dtor (zend_execute_API.c:443) 
==4538== by 0x823C1FF: _zval_ptr_dtor_wrapper (zend_variables.c:189) 
==4538== by 0x824E518: zend_hash_apply_deleter (zend_hash.c:614) 
==4538== Address 0x44c1718 is 8 bytes inside a block of size 20 free'd 

当发动机销毁对象,发生(当对象用完的范围 - 析构函数也叫)。

所以它看起来像ZE真的需要的refcount为2.所有其他 测试我写的工作很好,没有memleaks,没有segfaults什么。

我仍然有点困惑:为什么它需要它高于 (从我的理解)它应该是?

+1

如果构造函数作用域结束了,你有没有想过会减少一个refcount? – hakre

+0

是的,事实并非如此。 – Flavius

回答

0

@ hakre的问题让我觉得。

解释如下:当ZE破坏对象时,它也破坏(zval_ptr_dtor)对象的每个属性。因此,在析构函数被调用后有一个1的refcount是正确的,这是我目前所拥有的,因为我也在该特定属性上调用zval_ptr_dtor,将它的计数从2减少到1.

ZE将负责其余的部分。