statische Zeichenkettenliterale
-
Hallo,
ich habe noch nicht ganz den Sinn von statischen Zeichenkettenliteralen verstanden.
Nach einer Funktion wie
void f() { char* cp="Buchstaben"; }
bleibt der Speicher, auf den cp zeigt, erhalten. Der Zeiger aber selbst verschwindet und so entsteht eine Speicherlücke. Bei mehreren dutzend Funktionen enstehen also mehrere Speicherlücken (was ja bekanntlich nicht toll ist).
Um dem vorzubeugen, kann man einen Zeiger in die aufrufende Funktion zurückgeben und bei Bedarf den Speicher löschen - was aber ziemlich nervig ist.
Warum also wird der Speicher nach Funktionsende nicht einfach abgebaut? Warum muss ich den Speicher innerhalb der Funktion oder mittels Rückgabewert zwingend löschen?
Entweder ich hab den Sinn nich' verstanden oder das ganze Konzept von Zeichenkettenliteralen ist Schmarn. Bitte um Aufklärung.
-
Gute Frage...
Stroustrup umgeht eine Antwort, indem er es einfach als Tatsache dastehen lässt, dass "der Speicher(...) nach dem Aufruf der Funktion nicht verschwinden wird" (vgl. Kap.5.2).
Ich persönlich sehe es als logische Konsequenz der Sprachmittel. Man legt einen Zeiger lokal an und initialisiert ihn mit dem Speicherbereich eines Zeichenkettenliterals. Warum sollte der Speicher dann nach Funktionsaufruf gelöscht werden ? Aber vielleicht haben die Profis hier ja noch plausible Erklärungen parat...
Gruß
E-the-Real
-
Also wenn ich das richtig verstanden habe dann wird das Stringliteral im Speicher angelegt, aber doch nicht für jeden Funktionsaufruf ein neues, es existiert also für diese Funktion nur einmal und jede Instanz der Funktion arbeitet mit diesem. Also nichts was dann immer wieder gelöscht werden müsste.
-
Entyl_Sa schrieb:
Also wenn ich das richtig verstanden habe dann wird das Stringliteral im Speicher angelegt, aber doch nicht für jeden Funktionsaufruf ein neues, es existiert also für diese Funktion nur einmal und jede Instanz der Funktion arbeitet mit diesem. Also nichts was dann immer wieder gelöscht werden müsste.
Ja, das ist abhängig davon auf was cp tatsächlich zeigt. Ist das Literal immer gleich, als
char* cp="blabli";
dann ist es auch immer die selbe Speicherstelle. Wenn die Funktion allerdings etwas als Parameter erwartet, dann nicht mehr.
void f(char* cp) {}
f("blabli"); // speicher wird angelegt f("blub"); // neuer speicher wird angelget, da nicht identisch
-
Wenn du eine Funktion hast du so aussieht:
void f(char* cp)
Dann ist die Funktion ja eh nicht für den Speicher verantwortlich, sondern die aufrufende Funktion. Das Stringliteral gehoert ja dann auch zur aufrufenden Funktion und wird dort entsprechend behandelt.
f("blabli"); // speicher wird angelegt f("blub"); // neuer speicher wird angelget, da nicht identisch
Hier wird doch kein neuer Speicher angelegt, einmal wird ein Zeiger auf das eine Stringliteral und dann ein Zeiger auf das andere Stringliteral an f übergeben.
-
"foo"
ist ein literal dass immer gleich ist. Es liegt meistens im Readonly bereich der Binary.Da wird kein Speicher angelegt und auch keiner gelöscht. Denn "foo" liegt eben direkt in der Datei - wenn man so will. Deshalb darf man auch nicht "foo"[0]='b'; schreiben.
Ein Speicherloch entsteht nur wenn man new/malloc/calloc/realloc/... ohne passendes delete/free/... aufruft.
-
Der Ansatz dieses Beitrages klingt interessant, könnte das u.U. nicht was für die FAQ werden ?
-
**geloescht, da aus Versehen doppelt gepostet**