goto para limpiar en C
El único goto que la gente de C defiende: una sola salida que libera lo que se tomó.
#include <stdlib.h>
int build(int n, int **out) {
int *first = malloc((size_t) n * sizeof(int));
if (first == NULL) {
goto fail_first;
}
int *second = malloc((size_t) n * sizeof(int));
if (second == NULL) {
goto fail_second;
}
for (int i = 0; i < n; i++) {
first[i] = i;
second[i] = i * i;
}
free(second);
*out = first;
return 1;
fail_second:
free(first);
fail_first:
*out = NULL;
return 0;
}
Cómo funciona
- Cada falla salta a una sola etiqueta en vez de repetir los free.
- Los recursos se liberan en orden inverso a su adquisición.
- Saltar hacia atrás, en cambio, es como empieza el espagueti.
Palabras clave y builtins usados aquí
NULLforgotoifintreturnsize_tsizeof
El intento, en números
- Líneas
- 25
- Caracteres a escribir
- 394
- Tokens
- 137
- Ritmo de tres estrellas
- 100 tpm
Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 82 segundos.
Paso 4 de 4 en Propiedad y errores; paso 18 de 25 en Punteros y memoria.