Heim >Backend-Entwicklung >C++ >Warum ist die Rückgabe von „std::string.c_str()' gefährlich und wie kann ich undefiniertes Verhalten vermeiden?
Ungültigkeitserklärung des Rückgabewerts von std::string.c_str()
In C wird ein konstanter Zeichenzeiger (char*) zurückgegeben, der von abgeleitet ist Eine Instanz von std::string mit der Methode c_str() stellt ein potenzielles Problem dar. Dies kann zu undefiniertem Verhalten führen, da der Zeiger ungültig wird, sobald das std::string-Objekt zerstört wird.
Betrachten Sie das folgende Beispiel:
const char* returnCharPtr() { std::string someString; // Some processing! return someString.c_str(); }
In diesem Code ist ein std: :string-Objekt mit dem Namen someString wird lokal innerhalb der Funktion erstellt. Nach einiger Verarbeitung wird über die Methode c_str() auf sein internes Zeichenarray zugegriffen und ein Zeiger auf dieses Array zurückgegeben.
Wenn jedoch der Funktionsumfang endet, wird someString zerstört und der zugewiesene Speicher freigegeben. Infolgedessen wird der von c_str() zurückgegebene Zeiger zu einem baumelnden Zeiger, der auf einen Speicher zeigt, der nicht mehr gültig ist.
Lösung
Um dieses Problem zu vermeiden, Es gibt mehrere mögliche Ansätze:
Beispiel
Verwendung des std::string-Rückgabetyps:
std::string returnString() { std::string someString("something"); return someString; }
Diese Funktion gibt jetzt eine gültige Kopie der Zeichenfolge zurück und vermeidet mögliche fehlende Zeiger.
Das obige ist der detaillierte Inhalt vonWarum ist die Rückgabe von „std::string.c_str()' gefährlich und wie kann ich undefiniertes Verhalten vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!