13 Stimmen

Warum muss ich free für einen Zeiger verwenden, aber nicht für eine normale Deklaration?

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;

2voto

Joe Punkte 981

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.

0voto

Adam Naylor Punkte 5964

Zu den angesprochenen Punkten diese Stelle klärt die Dinge weiter.

-9voto

Pyrolistical Punkte 26854

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.

0 Stimmen

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).

0 Stimmen

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.

0 Stimmen

Argumentativ? Ich habe einfach eine Antwort auf höherem Niveau gegeben

CodeJaeger.com

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.

Powered by:

X