Digamos que estoy escribiendo una pequeña biblioteca en C, alguna estructura de datos, por ejemplo. ¿Qué debo hacer si no puedo asignar memoria?C Diseño de API: ¿qué hacer cuando malloc devuelve NULL?
Puede ser bastante importante, p. Necesito un poco de memoria para inicializar la estructura de datos en primer lugar, o estoy insertando un par de clave-valor y quiero envolverlo en una pequeña estructura. También podría ser menos crítico, por ejemplo, algo así como una función pretty_print
que crea una buena representación de cadena de los contenidos. Sin embargo, suele ser más grave que el error promedio: puede que no tenga sentido continuar. Una tonelada de usos de muestra de malloc
en línea simplemente directamente salga del programa si devuelve NULL
. Supongo que una gran cantidad de código de cliente real también lo hace: solo aparece algún error, o escríbalo en stderr
, y aborta. (Y una gran cantidad de código real probablemente no verifique el valor de retorno de malloc
en absoluto.)
A veces tiene sentido devolver NULL
, pero no siempre. Los códigos de error (o simplemente algún valor booleano success
), ya sea como valores devueltos o parámetros de salida funcionan bien, pero parece que pueden complicar o perjudicar la legibilidad de la API (entonces, de nuevo, ¿eso es algo esperado en un lenguaje como C?) Otra opción es tener algún tipo de estado de error interno que la persona que llama pueda consultar posteriormente, p. con una función get_error
, pero luego debe tener cuidado con la seguridad de los hilos, y puede ser fácil pasarla por alto; las personas tienden a ser poco estrictas a la hora de buscar errores de todos modos, y si se trata de una función separada, es posible que no las conozcan o que no se molesten (pero supongo que ese es su problema).
(a veces me he visto envuelto en malloc
una función que solo intenta de nuevo hasta que la memoria está disponible ...
void *my_malloc(size_t size)
{
void *result = NULL;
while (result == NULL)
result = malloc(size);
return result;
}
Pero eso parece un poco tonto y tal vez peligroso.)
¿Qué es un forma correcta de manejar esto?
La salida elegante sería una opción mía. – Till
@Till: Eso es absolutamente inaceptable para el código de la biblioteca. –
@R. whoopy, salté por completo la primera línea al leer esta pregunta. En ese caso, devuelva FALSE/NULL y agregue una función de estado de error para más detalles. – Till