Das hat mich schon seit Ewigkeiten gestört.
In der Schule wird uns allen beigebracht (zumindest war ich das), dass Sie jeden zugewiesenen Zeiger freigeben MÜSSEN. Ich bin allerdings etwas neugierig auf die tatsächlichen Kosten, die entstehen, wenn kein Speicher freigegeben wird. In einigen offensichtlichen Fällen, z. B. wenn malloc
sie innerhalb einer Schleife oder eines Teils einer Thread-Ausführung aufgerufen werden, ist es sehr wichtig, sie freizugeben, damit keine Speicherlecks auftreten. Betrachten Sie jedoch die folgenden zwei Beispiele:
Erstens, wenn ich Code habe, der ungefähr so aussieht:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
Was ist das wirkliche Ergebnis hier? Ich denke, dass der Prozess abbricht und dann der Heap-Speicherplatz ohnehin weg ist, sodass es nicht schadet, den Aufruf zu verpassen free
(ich erkenne jedoch, wie wichtig es ist, ihn trotzdem für den Abschluss, die Wartbarkeit und bewährte Verfahren zu haben). Habe ich recht mit diesem Denken?
Zweitens, nehmen wir an, ich habe ein Programm, das sich ein bisschen wie eine Shell verhält. Benutzer können Variablen wie deklarieren aaa = 123
und diese werden zur späteren Verwendung in einer dynamischen Datenstruktur gespeichert. Es ist klar, dass Sie eine Lösung verwenden würden, die eine * Alloc-Funktion aufruft (Hashmap, verknüpfte Liste, so etwas). Für diese Art von Programm ist es nicht sinnvoll, nach dem Aufruf jemals freizugeben, malloc
da diese Variablen während der Programmausführung jederzeit vorhanden sein müssen und es keine gute Möglichkeit gibt (wie ich sehen kann), dies mit statisch zugewiesenem Speicherplatz zu implementieren. Ist es schlechtes Design, eine Menge Speicher zu haben, der zugewiesen, aber nur als Teil des Prozessendes freigegeben wird? Wenn ja, was ist die Alternative?
free(a)
dies nicht wirklich dazu beiträgt, Speicherplatz freizugeben! Es werden lediglich einige Zeiger in der libc-Implementierung von malloc zurückgesetzt, die die verfügbaren Speicherblöcke auf einer großen zugeordneten Speicherseite (im Allgemeinen als "Heap" bezeichnet) verfolgen. Diese Seite wird immer noch nur freigegeben, wenn Ihr Programm beendet wird, nicht vorher.