Warum muss ich free() verwenden, wenn ich einen Zeiger deklariere wie z.B.:
int *temp = (int*)malloc(sizeof(int))
*temp = 3;
aber nicht, wenn ich es tue:
int temp = 3;
Warum muss ich free() verwenden, wenn ich einen Zeiger deklariere wie z.B.:
int *temp = (int*)malloc(sizeof(int))
*temp = 3;
aber nicht, wenn ich es tue:
int temp = 3;
Der Bedarf an free()
hängt nicht davon ab, ob Sie einen Zeiger deklariert haben oder nicht, sondern ob Sie malloc()
Gedächtnis.
Wie Brian Bondy schon sagte, Variablen (" int number
", " char string[10]
", " float your_boat
"usw.) verschwinden, wenn sie aus dem Anwendungsbereich fallen, z. B. wenn Ihr Code einen Funktionsblock verlässt. Also der Zeiger in Ihrer Frage (" temp
") verschwindet nicht, wenn Sie die free()
-- sondern das, was Ihr Code bei seinem Aufruf zugewiesen hat malloc()
geht weg. Ihr Zeiger bleibt jedoch an Ort und Stelle, d.h. unmittelbar nach Ihrem Beispielcode könnten Sie sagen " temp = &some_other_variable
", ohne (erneut) sagen zu müssen " int *temp;
".
Wenn jemand eine Funktion implementiert, die er zufällig auch aufruft malloc()
die Speicher für Ihr Programm beanspruchen würde, und die Sie nicht dazu verpflichtete, diese Daten freizugeben dann könnten Sie sagen
int * temp = (int*)malloc(sizeof(int));
ohne später zu sagen
free(temp);
Aber das ist nicht der Weg malloc()
umgesetzt wird.
Zu den angesprochenen Punkten diese Stelle klärt die Dinge weiter.
Das ist eine sehr gute Frage. Viele würden antworten, dass es sich um den Unterschied zwischen Stack- und Heap-Zuweisung handelt, aber die eigentliche Antwort ist, dass das unterliegende System Ihnen etwas offenbart hat, was es nicht sollte.
Wenn Sie Speicher zuweisen, sollten Sie sich nicht darum kümmern müssen, ihn wieder zurückzugeben. Das System sollte intelligent genug sein, um herauszufinden, dass Sie keinen Zugriff (Punkt oder Verweis) mehr darauf haben, und kann daher den Speicher automatisch zurücknehmen.
Neuere Sprachen wie Java und C# haben dies getan.
Das ist argumentativ und beantwortet die Frage nicht. Es hat auch nichts mit dem Alter der Sprache zu tun (siehe Lisp als Beispiel für eine alte Sprache mit Garbage Collection).
Ich denke, die Aussage "Wenn Sie Speicher zuweisen, sollten Sie sich keine Gedanken darüber machen müssen, ob Sie ihn zurückgeben" ist ziemlich naiv. Ich würde sagen, man sollte sich ~immer~ Gedanken über die Rückgabe machen, selbst wenn Ihre Umgebung eine Garbage Collection beinhaltet.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.