Me gustaría crear y devolver una matriz de matrices en una extensión de PHP. Por lo que entiendo, debería asignar el espacio para los elementos de la matriz usando emalloc()
, pero lo que no entiendo es cuándo es apropiado liberarlo. Tengo una función PHP similar a esto:¿Cuándo liberar memoria en una extensión de 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]);
}
}
Dónde debería liberar la memoria asignada para pt
?
Llamo 'array_init (pt [i]);' justo después de 'MAKE_STD_ZVAL()', olvidé agregarlo al ejemplo. Entonces, si lo entiendo correctamente, no debería llamar a 'emalloc()' en absoluto, porque 'MAKE_STD_ZVAL()' es responsable de asignar la memoria, y la memoria se desasigna cuando su recuento de referencia llega a cero (y eso debería ocurrir) cuando se sale del alcance en PHP, si solo se hace referencia una vez). – rid
@Radu Sí, 'MAKE_STD_ZVAL' también asigna (con' emalloc') el zval. Sin embargo, su primera llamada a 'emalloc' no está asignando un zval, está asignando una matriz de 10 zval *, que no es el mismo thibg. Como dijo 'actual', puede usar una variable local para eso, o puede abandonar la matriz por completo y hacer:' {zval * zv; MAKE_STD_ZVAL (zv); add_index_double (zv, 0, 1); add_index_zval (return_value, i, zv); } ' – Artefacto