Я хотел бы создать и вернуть массив массивов в расширение PHP. Из того, что я понимаю, я должен выделить пространство для элементов массива, используя emalloc()
, но я не понимаю, когда это целесообразно, чтобы освободить его. У меня есть PHP-функция, подобная этой:Когда освободить память в расширении PHP?
PHP_FUNCTION(test)
{
int i;
zval **pt = emalloc(sizeof(zval*) * 10);
array_init(return_value);
for (i = 0; i < 10; ++i) {
MAKE_STD_ZVAL(pt[i]);
array_init(pt[i]);
add_index_double(pt[i], 0, 1);
add_index_zval(return_value, i, pt[i]);
}
}
Где я должен освободить память, выделенную для pt
?
Я называю 'array_init (pt [i]);' сразу после 'MAKE_STD_ZVAL()' забыл добавить его в пример. Итак, если я правильно понимаю, я не должен называть 'emalloc()' вообще, потому что 'MAKE_STD_ZVAL()' отвечает за выделение памяти, а память освобождается, когда счетчик ссылок приходит к нулю (и это должно произойти когда он выходит из области видимости в PHP, если он упоминается только один раз). – rid
@Radu Да, 'MAKE_STD_ZVAL' выделяет (с' emalloc') и zval. Однако ваш первый вызов 'emalloc' не выделяет zval, он выделяет массив из 10 zval *, который не является тибгом. Как и «фактический», вы можете использовать для этого локальную переменную, или вы можете полностью отказаться от массива и сделать: '{zval * zv; MAKE_STD_ZVAL (ZV); add_index_double (zv, 0, 1); add_index_zval (return_value, i, zv); } '. – Artefacto