lo personal; Tengo una biblioteca de seguimiento de recursos (básicamente un árbol binario equilibrado) y tengo envoltorios para todas las funciones de asignación.
Los recursos (como memoria, sockets, descriptores de archivos, semáforos, etc., cualquier cosa que asigne y desasigne) pueden pertenecer a un conjunto.
También tengo una biblioteca de manejo de errores, donde el primer argumento para cada función es un conjunto de errores y si algo sale mal, la función que experimenta un error envía un error al conjunto de errores.
Si un conjunto de errores contiene un error, ninguna función ejecuta. (Tengo una macro en la parte superior de cada función que hace que vuelva).
Así que múltiples mallocs se ven así;
mem[0] = malloc_wrapper(error_set, resource_set, 100);
mem[1] = malloc_wrapper(error_set, resource_set, 50);
mem[2] = malloc_wrapper(error_set, resource_set, 20);
No hay necesidad de comprobar el valor de retorno, ya que si se produce un error, no hay siguientes funciones se ejecutarán, por ejemplo, los siguientes mallocs nunca ocurren.
Por lo tanto, cuando llegue el momento de desasignar recursos (por ejemplo, al final de una función, donde todos los recursos utilizados internamente por esa función se han colocado en un conjunto), desasigno el conjunto. Es solo una llamada de función.
res_delete_set(resource_set);
No necesito para comprobar específicamente para errores - hay ninguna si() s en mi código de comprobación de valores de retorno, lo que hace que sea fácil de mantener; Encuentro que la vida útil del control de errores en línea destruye la legibilidad y, por lo tanto, el mantenimiento. Solo tengo una lista simple de llamadas a funciones.
Es arte, el hombre :-)
Las declaraciones goto están bien en ciertas situaciones. Vemos mucho este tipo de limpieza en el kernel de Linux. Funciona bien y es fácil de entender. –
@Steve Lazaridis: Exactamente. Trabajar con el kernel de Linux me enseñó que a veces, goto está bien. :) – FreeMemory
Eso no funcionará de manera confiable a menos que pre-cero el * mem1 y * mem2. –