Speicher freigeben. Wie? und Wo?
-
char* getstring(const char* s, int a) { char* t=(char*)malloc(a*sizeof(char)); /* Hier kommt was rein */ return t; }
Meine Frage, was mach ich mit dem reservierten Speicher? Den muss ich doch am Ende der FUnktion freigeben.
-
push
-
Das wär nicht besonders geistreich, den freizugeben. Dann würdest du ja mit t einen Zeiger auf freigegebenen Speicher zurückgeben, was soll denn ein Aufrufer damit anfangen?
BTW Stilanmerkung: sizeof(char) ist als 1 definiert, für immer und in alle Ewigkeit. malloc-Rückgabewerte casten ist unnötig und kann u.U. Fehler verschleiern. Also:
char *t = malloc(a);
-
Den Speicher solltest Du erst dann freigeben wenn Du ihn nicht mehr brauchst. Also allerspätestens beim Beenden des Programms und frühestens nachdem Du den Rückgabewert verarbeitet hast.
-
NobbZ schrieb:
Den Speicher solltest Du erst dann freigeben wenn Du ihn nicht mehr brauchst. Also allerspätestens beim Beenden des Programms und frühestens nachdem Du den Rückgabewert verarbeitet hast.
Der Zeiger ist doch ungültig wenn ich die Funktion verlasse. Also kann ich es auch nicht mehr freigeben. Und wenn ich das ausserhalb der Funktion mache meckert das OS.
char* test = getstring(const char* s, int a); . . . free(test); //<- Fehler
cu
-
NAFNAF schrieb:
Der Zeiger ist doch ungültig wenn ich die Funktion verlasse.
Nein, warum? Er zeigt ja nicht auf eine automatische Variable.
Also kann ich es auch nicht mehr freigeben. Und wenn ich das ausserhalb der Funktion mache meckert das OS.
char* test = getstring(const char* s, int a); . . . free(test); //<- Fehler
Das ist schon richtig so. Wenn es beim free ein Problem gibt, hast du irgendwas anderes falsch gemacht, vielleicht über die Grenze des angeforderten Speicherblocks hinweg geschrieben.
-
Ja das ist nicht gut
Dann kann ich die Funktion z.B. nicht als Parameter benutzen.
z.B.
char* a="Hallo Welt"; bool Vergleiche("Hallo",getString(a,10));
-
Richtig, sowas geht nicht in C. Dazu brauchst du entweder eine Sprache mit Garbage Collection oder sowas wie Smartpointer in C++.