Heim >Backend-Entwicklung >C++ >Ist es sicher, std::string::c_str() für temporäre Zeichenfolgen in C zu verwenden?

Ist es sicher, std::string::c_str() für temporäre Zeichenfolgen in C zu verwenden?

Linda Hamilton
Linda HamiltonOriginal
2024-11-11 11:42:02408Durchsuche

Is it Safe to Use std::string::c_str() on Temporary Strings in C  ?

Ist es sicher, std::string::c_str() für temporäre Zeichenfolgen zu verwenden?

In C ist die Verwendung von std: :string::c_str() für temporäre Zeichenfolgen gab Anlass zur Sorge. Betrachten Sie den folgenden Codeausschnitt:

void consumer(char const* p) { std::printf("%s", p); }

std::string random_string_generator();

consumer(random_string_generator().c_str());

Die Sorge entsteht, weil beim Aufruf von std::string::c_str() für das temporäre std::string-Objekt die Zerstörung des String-Objekts unmittelbar bevorzustehen scheint.

Gemäß dem C 11-Standard referenziert der über std::string::c_str() abgerufene Zeiger jedoch auf den vom String-Objekt verwalteten Speicher und seine Gültigkeit erstreckt sich bis:

  • Eine nicht konstante Memberfunktion wird für das Zeichenfolgenobjekt aufgerufen.
  • Das Zeichenfolgenobjekt wird zerstört.

Im bereitgestellten Codeausschnitt wird das temporäre Zeichenfolgenobjekt am Ende von zerstört der vollständige Ausdruck (d. h. nach dem Aufruf von Consumer()). Daher gilt der Code als sicher, da der über std::string::c_str() abgerufene Zeiger während des gesamten Aufrufs von Consumer() gültig bleibt.

Die Lebensdauer temporärer Objekte ist seit C 98 klar definiert , anders als in früheren Versionen von C, wo es je nach Compiler unterschiedlich war. Dadurch gilt Code, der in früheren Versionen einst unsicher war, jetzt mit modernen C-Compilern als sicher.

Das obige ist der detaillierte Inhalt vonIst es sicher, std::string::c_str() für temporäre Zeichenfolgen in C zu verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn