Quindi ho una funzione che è come un costruttore per la mia struttura:
MyStructure* CreateMyStructure(...)
{
MyStructure *my_structure;
double *data;
int *colind, *rowptrs;
data = malloc(sizeof(double)*N);
if (data == NULL) { return(NULL); }
colind = malloc(sizeof(int)*N);
if (colind == NULL) { free(data); return(NULL); }
rowptrs = malloc(sizeof(int)*K);
if (rowptrs == NULL) { free(colind); free(data); return(NULL); }
my_structure = malloc(sizeof(my_structure));
if (my_structure == NULL) {
free(rowptrs); free(colind); free(data);
return(NULL);
}
return(my_structure);
}
Questo schema si ripresenta in un sacco di codebase, quindi sto cercando di trovare qualcosa di più pulito. Ho pensato di creare alcune macro come queste:
#define CHECK_MALLOC1(var, dep1) \
do { \
if (var == NULL) { free(dep1); return(NULL); } \
} while(0)
#define CHECK_MALLOC2(var, dep1, dep2) /* pattern continues */
Tuttavia, ho deciso contro di loro perché non voglio cambiare il flusso di controllo all'interno di una macro. Esiste un modello alternativo che potrebbe aiutare a ridurre la ripetizione senza sacrificare la capacità di alcuni di capire cosa sta succedendo?