Betrachten Sie dieses Programm:Eine andere Möglichkeit, in C aufzuräumen?
int main(void)
{
int* i = malloc(sizeof(int));
int* j = malloc(sizeof(int));
}
dies jedoch ist ein naiver Ansatz, weil malloc
fehlschlagen und die Zeiger sind nicht free
‚d.
So können Sie dies tun:
int main(void)
{
int* i;
int* j;
if ((i = malloc(sizeof(int)) < 0)
{
return -1;
}
if ((j = malloc(sizeof(int)) < 0)
{
free(i);
return -1;
}
free(i);
free(j);
}
Jedoch habe ich diesen sehr fehleranfällig betrachten. Erwägen Sie, 20 Zeiger zuzuordnen, im letzten malloc
Fehlerfall müssen Sie free
19 Variablen und dann return -1
.
Ich weiß auch, atexit
, was mir, es zu schreiben, wie dies helfen kann:
int* i;
int* j;
void del_i(void)
{
free(i);
}
void del_j(void)
{
free(j);
}
int main(void)
{
if ((i = malloc(sizeof(int)) < 0)
{
return -1;
}
else
{
atexit(del_i);
}
if ((j = malloc(sizeof(int)) < 0)
{
return -1;
}
else
{
atexit(del_j);
}
}
Was ist besser, aber ich mag nicht mit allen Zeigern als global zu erklären. Gibt es eine Möglichkeit, diese beiden Ansätze zu kombinieren, im Grunde:
- Mit Destruktoren für Zeiger, die entweder direkt ausgeführt werden kann oder mit
atexit
verwendet werden. - Zeiger auf lokale Funktionen haben.
ich nicht bekommen Ihr Punkt. Wenn Sie die Ausführung des Programms beenden/stoppen, warum sollten Sie sich dann über 'free()' Gedanken machen? –
1. Sie sollten immer "frei" Zeiger. 2. Betrachten Sie dies im Zusammenhang mit einem größeren Programm – hgiesel
Danke für die Aufklärung, aber ich bleibe bei meiner Version. :) –