Qual è il modo consigliato di gestire più errori malloc che potrebbero verificarsi in sequenza come nel codice seguente?Modo consigliato per gestire più errori malloc in una singola funzione in C
bool myFunc(int x, int y)
{
int *pBufX = null;
int *pBufY = null;
if((x <= 0) || (y <= 0))
{
return false;
}
pBufX = (int*)malloc(sizeof(int) * x);
if(pBufX == null)
{
return false;
}
pBufY = (int*)malloc(sizeof(int) * y);
if(pBufY == null)
{
free(pBufX) //free the previously allocated pBufX
return false;
}
//do something useful
free(pBufX);
free(pBufY);
return true;
}
Il problema di questo approccio è che se il numero di mallocs sono alti, si potrebbe dimenticare di liberare e causare perdite di memoria. Inoltre, se è presente una sorta di registro che deve essere emessa quando si verifica un errore, il codice diventa molto lungo.
Ho visto il codice che li gestisce con un goto, in cui si cancellano tutti i mallocs in un unico posto, solo una volta. Il codice non è lungo, ma non mi piace usare gotos.
C'è un modo migliore di uno di questi due approcci?
Forse il problema è il design in primo luogo. Esiste una regola empirica quando si progettano le funzioni quando si tratta di ridurre al minimo più mallocs?
Modifica: C'è un altro modo che ho visto e utilizzato. Invece di usare goto, si mantiene uno stato del programma e si procede solo se lo stato è OK. Simile al goto ma non all'uso di goto. Ma questo aumenta il numero di istruzioni if che potrebbero far rallentare il codice.
bool myFunc(int x, int y)
{
int *pBufX = null;
int *pBufY = null;
bool bRet = true;
if((x <= 0) || (y <= 0))
{
return false;
}
pBufX = (int*)malloc(sizeof(int) * x);
if(pBufX == null)
{
bRet = false;
}
if(bRet == true)
{
pBufY = (int*)malloc(sizeof(int) * y);
if(pBufY == null)
{
bRet = false;
}
}
//do something useful
if(pBufX != null)
free(pBufX);
if(pBufY != null)
free(pBufY);
return bRet;
}
Questo è uno dei rari casi in cui 'goto' può essere davvero utile. –
Appena fuori argomento ** - ** Non 'libero'' x' e 'y' non sono puntatori con memoria allocata. – ameyCU
Siamo spiacenti! Volevo digitare pBufX e pBufY. Colpa mia. –