Что-то меня смущает.Пусть существует член класса 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. Все другие написанные мною тесты работают нормально, без утечек, без сбоев.
Тем не менее, я немного запутался: ПОЧЕМУ это должно быть выше, чем (из моего понимания) это должно быть?