有些东西让我困惑。让一个班级成员
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,没有任何段错误。
我仍然有点困惑:为什么它需要它高于 (根据我的理解)它应该是?
答案 0 :(得分:0)
@ hakre的问题让我想到了。
解释如下:当ZE破坏对象时,它还会破坏(zval_ptr_dtor
)对象的每个属性。因此,在调用析构函数之后将refcount设置为1是正确的,这是我目前所拥有的,因为我还在该特定属性上调用zval_ptr_dtor
,将其引用计数从2减少到1。
ZE将负责其余部分。