php扩展中引用计数的一些疑问

function test($arr) {
    return $arr;
}

$arr = [1111];
test($arr);
debug_zval_dump($arr);

test的c实现代码:

PHP_FUNCTION(test)
{
    zval *arr;
    ZEND_PARSE_PARAMETERS_START(1, 1)
        Z_PARAM_ARRAY(arr)
    ZEND_PARSE_PARAMETERS_END();

    Z_TRY_ADDREF_P(arr);
    RETURN_ARR(Z_ARR_P(arr));
}

这段代码中$arr最终的引用计数是3,$arr定义的时候为1,调用test方法时内核通过宏Z_TRY_ADDREF_P加1,作为debug_zval_dump的参数时加1。问题是调用test方法时为什么要加1,而不是等到需要test的返回值的时候再加1?

$c = [33333];

$t = [
    'a' => 111,
    'c' => $c
];

$t['c'] = 222;
// test_set($t, 'c', 2111);

直接操作数组或调用test_set修改键"c"的值,变量$c的引用计数都减1了
test_set的c实现代码:

PHP_FUNCTION(test_set)
{
    zval *arr, *val;
    zend_string *key;
    ZEND_PARSE_PARAMETERS_START(3, 3)
        Z_PARAM_ARRAY_EX(arr, 0, 1)
        Z_PARAM_STR(key)
        Z_PARAM_ZVAL(val)
    ZEND_PARSE_PARAMETERS_END();

    Z_TRY_ADDREF_P(val);
    zend_symtable_update(Z_ARRVAL_P(arr), key, val);

    RETURN_TRUE;
}

在test_set中并没有对引用进行减1操作,请问这里的减1操作发生在那里?

阅读 1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题