【问题标题】:Array as class member and refcounting数组作为类成员和引用计数
【发布时间】:2011-11-03 12:38:47
【问题描述】:

有些事情让我感到困惑。让有一个班级成员 Foo::$bar,必须在 构造函数。如果我这样做(通过zend_update_property),它的引用计数是 增加(从在 alloc + array_init 之后得到的 1 到 2)。它是 很明显为什么会发生这种情况,因为从zend_update_property 的角度来看,它得到了 来自外部世界的某个人的变量,所以++它是正确的。

但在这种特殊情况下,在 构造函数,它不需要 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。所有其他 我编写的测试工作正常,没有内存泄漏,没有任何段错误。

我还是有点困惑:为什么它需要高于 (根据我的理解)应该是?

【问题讨论】:

  • 你有没有想过,如果构造函数作用域结束,一个引用计数会减少?

标签: php php-internals


【解决方案1】:

@hakre 的问题让我思考。

解释如下:ZE在销毁对象的同时也销毁(zval_ptr_dtor)对象的每个属性。因此,在调用析构函数后将引用计数设置为 1 是正确的,这就是我目前所拥有的,因为我还在该特定属性上调用 zval_ptr_dtor,将其引用计数从 2 减少到 1。

ZE 将负责其余的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2015-04-03
    相关资源
    最近更新 更多