Wie wird empfohlen, mehrere Malloc-Fehler zu behandeln, die wie im folgenden Code nacheinander auftreten können?Empfohlene Methode zur Behandlung mehrerer malloc-Fehler in einer einzigen Funktion 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;
}
Das Problem bei diesem Ansatz ist, dass, wenn die Anzahl der mallocs hoch sind, könnten Sie etwas zu befreien vergessen und Speicherlecks verursachen. Wenn es eine Art von Protokoll gibt, das bei Auftreten eines Fehlers ausgegeben werden muss, wird der Code sehr lang.
Ich habe Code gesehen, der diese mit einem Goto behandelt, wo Sie alle Mallocs an einem Ort löschen, nur einmal. Der Code ist nicht lang, aber ich mag es nicht, gotos zu benutzen.
Gibt es einen besseren Weg als beide dieser Ansätze?
Vielleicht ist das Problem mit dem Design in erster Linie. Gibt es eine Faustregel beim Entwurf von Funktionen, wenn es darum geht, mehrere mallocs zu minimieren?
Edit: Es gibt einen anderen Weg, den ich gesehen und benutzt habe. Anstatt goto zu verwenden, behalten Sie den Status des Programms und fahren nur fort, wenn der Status OK ist. Ähnlich wie goto, aber nicht mit goto. Aber das erhöht die Anzahl der if-Anweisungen, die den Code langsamer laufen lassen könnten.
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;
}
Das ist einer der seltenen Fälle, in denen 'goto' wirklich nützlich sein kann. –
Direkt vom Thema ** - ** Nicht 'frei'' x' und 'y' sind keine Zeiger mit zugeordnetem Speicher. – ameyCU
Entschuldigung! Wollte pBufX und pBufY eingeben. Mein Fehler. –