标签:object pre UNC 并且 没有 优先 内存管理 argument 增加
struct _zval_struct {
union {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
zend_ast *ast;
} value; /* 变量的值 */
zend_uint refcount__gc; /* 引用次数 */
zend_uchar type; /* 变量当前的数据类型 */
zend_uchar is_ref__gc; /* 是否是属于引用集合 */
};
struct _zval_struct {
union {
zend_long lval; /* long value */
double dval; /* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} value; /* 变量的值 */
union {
struct {
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar reserved) /* call info for EX(This) */
} v; /* 简化赋值, 四个字符变量的结构体 */
uint32_t type_info; /* 类型信息 */
} u1;
union {
uint32_t var_flags;
uint32_t next; /* hash碰撞链 */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* 行号(AST,对象生成树槽点) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach位置 */
uint32_t fe_iter_idx; /* foreach迭代器索引 */
} u2;
};
<?php
$a = ['one'];
$a[] = &$a;
xdebug_debug_zval('a');
/**
(refcount=2, is_ref=1),
array (size=2)
0 => (refcount=1, is_ref=0),string 'one' (length=3)
1 => (refcount=2, is_ref=1),
*/
<?php
$a = ['one']; //--- zval_a(将$a对应的zval,命名为zval_a)
$a[] = &$a; //--- step1
unset($a); //--- step2
对于一个包含环形引用的数组,对数组中包含的每个元素的zval进行减1操作,之后如果发现数组自身的zval的refcount变成了0,那么可以判断这个数组是一个垃圾。
标签:object pre UNC 并且 没有 优先 内存管理 argument 增加
原文地址:https://www.cnblogs.com/one-villager/p/8865403.html