Wie initialisiere ich eine std :: string mit ""?

8

Ich habe Probleme mit der Initialisierung einer std :: string-Variable mit "" (d. h. eine leere Zeichenfolge). Es verursacht merkwürdiges Verhalten in Code, der zuvor funktionierte. Ist die folgende Aussage falsch?

%Vor%

Wenn ich den folgenden Code verwende, funktioniert alles:

%Vor%

Ich glaube, dass String-Literale an einem separaten Speicherort gespeichert sind, der compilerabhängig ist. Könnte das Problem, das ich sehe, tatsächlich eine Beschädigung dieses Speichers anzeigen? Wenn ja, würde es durch die Verwendung der Funktion clear() ausgeblendet werden.

Danke.

    
Mohsin 18.03.2011, 15:20
quelle

4 Antworten

4

Was passiert, wenn du nur std::string operationalReason; machst? Das sollte die gleiche Wirkung haben wie die beiden Beispiele, die Sie angegeben haben. Wenn tatsächlich Probleme auftreten, wenn Sie das Formular std::string operationalReason = ""; verwenden, das darauf hinweisen kann, dass der Datenspeicher der Zeichenfolge beschädigt wurde, kann dies jedoch auch bedeuten, dass ein anderer ANDERER Speicherbereich beschädigt ist und diese Zeile sich anders manifestiert .

Stürzt Ihr Code sofort ab, wenn Sie das "" -Formular oder später zur Laufzeit verwenden? Können Sie dies unter valgrind o.ä. ausführen, um festzustellen, ob es Speicherprobleme gibt? Was passiert, wenn Sie die Zeichenfolge mit einem anderen Literal als "" ? Initialisiert haben?

    
Mark B 18.03.2011, 15:50
quelle
24
%Vor%

Er ruft den Standardkonstruktor auf und erzeugt trotzdem eine leere Zeichenfolge.

Ich würde also sagen, std::string operationalReason = "" ist übertrieben.

    
Nawaz 18.03.2011 15:23
quelle
10

std::string operationalReason = "";

Das ist vollkommen in Ordnung, technisch, aber häufiger und schön ist nur

std::string operationalReason;

Der Standard-ctor der Zeichenfolge wird eine leere Zeichenfolge

erstellen

Ja, Sie haben recht, wenn String-Literale in einem nicht-änderbaren Speicher gespeichert werden, blah, blah usw. usw., aber der String copy-ctor kopiert immer die Zeichenfolge oder den C-String, die übergeben wurden

    
Armen Tsirunyan 18.03.2011 15:22
quelle
-4

Die beiden Formen sind korrigiert, aber diese:

%Vor%

Ruft den Konstruktor auf, der ein const char * als Argument benötigt. Zuerst ruft es den Standardkonstruktor auf und versucht dann, die Daten zu kopieren, in diesem Fall nichts.

%Vor%

ist vorzuziehen. Sie können clear() verwenden, um es auf eine leere Zeichenfolge zurückzusetzen.

    
mik 18.03.2011 15:38
quelle

Tags und Links