Supongamos que escribo mi código muy a la defensiva y siempre compruebo los tipos de devolución de todas las funciones que llamo.¿Cómo evitar cadena larga de libre (o elimina) después de cada comprobación de error en C?
Así que van como:
char* function() {
char* mem = get_memory(100); // first allocation
if (!mem) return NULL;
struct binder* b = get_binder('regular binder'); // second allocation
if (!b) {
free(mem);
return NULL;
}
struct file* f = mk_file(); // third allocation
if (!f) {
free(mem);
free_binder(b);
return NULL;
}
// ...
}
Aviso la rapidez consiguen free()
cosas fuera de control. Si parte de la función falla, tengo que liberar cada asignación anterior. El código rápidamente se vuelve feo y todo lo que hago es copiar y pegar todo. Me convierto en un programador de copiar/pegar, y lo que es peor, si alguien agrega una declaración en algún punto intermedio, tiene que modificar todo el código a continuación para llamar al free()
y agregarlo.
¿Cómo hacen los programadores de C experimentados este problema? No puedo entender nada.
Gracias, Boda Cydo.
+1 - aunque no es popular en la escuela, esto es lo más práctico y se hace todo el tiempo. ponga todas sus declaraciones libres en una etiqueta justo antes de abandonar la función, primero compruebe una variable de estado si es necesario, y use GOTO. –
¿Cómo funciona eso? Nunca escuché acerca de esta técnica. ¿Puedes ilustrarlo por favor? – bodacydo
Ahí tienes, sería algo así. – karlphillip