Zend Framework — PHP 7 возвращает динамический alloc zval в правильном направлении

Каков на самом деле правильный способ вернуть динамически распределенный zval из функции c и зарегистрировать его автоматический dtor?

zval * php_test_fcn() {
zval * t;
t = ecalloc(sizeof(zval), 1);
ZVAL_LONG(t, 1);
return t;
}

А с другой стороны я звоню:

zval **params = NULL;
int arg_num=5;
int x=0;
params = ecalloc(arg_num, sizeof(zval));
for(x=0; x<arg_num; x++) {
params[i]=php_test_fcn();
}

///SOME MORE code
/// call_user_function .....
call_user_function(EG(function_table), NULL, func, &return_value, arg_num, *params TSRMLS_CC);
//cleanup
for(x=0; x<arg_num; x++) {
zval_ptr_dtor(params[i]);
}
efree(params);

До PHP 7 я использовал: MAKE_STD_ZVAL() который, казалось, зарегистрировал авто-дтор.
сейчас Вальгринд показывает, что ecalloc от php_test_fcn() Утечки.

Любой совет?

PS: код извлекается из проекта, и, возможно, не на 100% правильно — я пытался минимизировать его.

ОБНОВИТЬ:

Ecalloc по параметрам — это фактическая утечка.

Если я сделаю это:

zval params[100];
int  i      = 0;
int  arg_num  = lua_gettop(L);

//params = ecalloc(arg_num, sizeof(zval));
if(arg_num >= 100) return 0;

for (i=0; i<arg_num; i++) {
//params[i] = php_lua_get_zval_from_lua(L, -(arg_num-i), NULL TSRMLS_CC);
ZVAL_COPY_VALUE(&params[i], php_lua_get_zval_from_lua(L, -(arg_num-i), NULL TSRMLS_CC));

}

call_user_function(EG(function_table), NULL, func, &return_value, arg_num, params TSRMLS_CC);
php_lua_send_zval_to_lua(L, &return_value TSRMLS_CC);

for (i=0; i<arg_num; i++) {
zval_ptr_dtor(&params[i]);
}

//efree(params);
zval_ptr_dtor(&return_value);

Это не утечка — потому что локальные переменные.
любая идея, что случилось с ecalloc на ** указатель?

1

Решение

хорошо ответил себе: D

проблема была **указатель.

Финальный код — сделал это:

zval * params = NULL;
zval * t;
int  i      = 0;
int  arg_num  = lua_gettop(L);

params = safe_emalloc(sizeof(zval), arg_num, 0);
//if(arg_num >= 100) return 0;

for (i=0; i<arg_num; i++) {
//params[i]=ecalloc(1, sizeof(zval));
//params[i] = php_lua_get_zval_from_lua(L, -(arg_num-i), NULL TSRMLS_CC);
params[i]=*php_lua_get_zval_from_lua(L, -(arg_num-i), NULL TSRMLS_CC);
}call_user_function(EG(function_table), NULL, func, &return_value, arg_num, params TSRMLS_CC);
php_lua_send_zval_to_lua(L, &return_value TSRMLS_CC);

for (i=0; i<arg_num; i++) {
zval_ptr_dtor(&params[i]);
//efree(params[i]);
}

efree(params);
zval_ptr_dtor(&return_value);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]