Ich möchte also besser verstehen, wie String-Literale in C ++ funktionieren. Mir geht es hauptsächlich um Situationen, in denen Sie einem Zeiger die Adresse eines Stringliterals zuweisen und diese übergeben. Zum Beispiel:
%Vor%Nehmen wir nun an, ich übergebe diese Zeichenfolge einfach, indem ich Zeiger für die Dauer des Programms kopiere. Sicher, es ist wahrscheinlich keine gute Idee, aber ich bin neugierig, was eigentlich hinter den Kulissen vor sich geht.
Nehmen wir als weiteres Beispiel eine Funktion, die ein String-Literal zurückgibt:
%Vor%Nehmen wir an, diese Funktion wird sehr oft aufgerufen, und das String-Literal wird nur etwa zur Hälfte der Zeit verwendet, in der es aufgerufen wird:
%Vor%In der ersten Situation, was passiert eigentlich? Wird die Zeichenfolge nur erstellt, aber nicht verwendet und nie freigegeben?
Wird die Zeichenfolge in der zweiten Situation beibehalten, solange der Benutzer dies benötigt? Was passiert, wenn es nicht mehr benötigt wird ... wird diese Erinnerung dann frei gemacht (vorausgesetzt, dass nichts mehr auf diesen Raum zeigt)?
Versteh mich nicht falsch, ich habe nicht vor, Zeichenkettenliterale wie diese zu verwenden. Ich plane, einen Container zu verwenden, um meine Saiten in Schach zu halten (wahrscheinlich std :: string). Ich möchte meist nur wissen, ob diese Situationen Probleme bei der Speicherverwaltung oder bei beschädigten Daten verursachen können.
String-Literale haben den Typ const char[N]
(wobei N
die Länge + 1 ist) und sind statisch zugeordnet. Sie müssen sich nicht um Speicherprobleme kümmern. Wenn in Ihrem Programm ein String verwendet wird, wird er für Sie behandelt und befindet sich irgendwo im Programmspeicher (normalerweise schreibgeschützt).
Das heißt, diese sind "gleich":
%Vor% Wenn Sie auf ein Zeichenfolgenliteral zeigen, zeigen Sie auf das erste Zeichen im Array. Da der Typ const char[]
ist, ist es nur sicher, über const char*
darauf zu zeigen. Die Konvertierung von Zeichenfolgenliteral in char*
ist veraltet und unsicher.
Deklarieren Sie zuerst den Rückgabewert von foo als const, da String-Literale Konstanten sind, die nicht geändert werden können, ohne das gefürchtete "undefined-Verhalten" zu verursachen. Dies erzwingt dann, dass alle Zeiger, die den Rückgabewert von foo verwenden, auch als const deklariert werden und möglicherweise den Schaden begrenzen, der (normalerweise unbeabsichtigt) ausgeführt werden kann. Zeichenfolgenliterale werden im Bereich 'text' einer binären ausführbaren Datei gespeichert - sie werden zur Laufzeit nicht als solche erstellt.
Tags und Links string c++ memory-management string-literals