Heim > Backend-Entwicklung > C++ > Ist es sicher, „std::string::c_str()' mit temporären Strings in C zu verwenden?

Ist es sicher, „std::string::c_str()' mit temporären Strings in C zu verwenden?

Patricia Arquette
Freigeben: 2024-11-06 17:51:02
Original
919 Leute haben es durchsucht

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

Potenzielle Fallstricke bei der Verwendung von std::string::c_str() mit temporären Zeichenfolgen

Bedenken Sie das folgende C-Code-Snippet:

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

std::string random_string_generator();

consumer(random_string_generator().c_str());
Nach dem Login kopieren

Dieser Code wirft die Frage auf, ob er gemäß dem C-Standard wohlgeformt ist.

Die Sorge rührt von der Tatsache her, dass random_string_generator() ein temporäres std::string-Objekt zurückgibt. Wir nehmen dann den c_str()-Zeiger und machen das temporäre std::string-Objekt möglicherweise anfällig für Zerstörung, bevor der Zeiger verwendet wird.

Um die Auswirkungen zu verstehen, müssen wir uns mit der Lebensdauer von Temporären in C befassen.

Gemäß dem C-Standard erstreckt sich die Lebensdauer eines temporären Elements bis zum Ende des vollständigen Ausdrucks, in dem es erstellt wurde. In diesem Fall ist der vollständige Ausdruck der Aufruf an den Verbraucher. Daher wird das temporäre std::string-Objekt erst zerstört, nachdem die Ausführung der Consumer-Funktion abgeschlossen ist.

Somit bleibt der c_str()-Zeiger, den wir erhalten haben, während des gesamten Aufrufs an den Consumer gültig, was unseren Code gut macht -geformt und sicher zu verwenden.

Es ist wichtig zu beachten, dass diese Garantie nur für die Lebensdauer des vollständigen Ausdrucks gilt. Wenn der c_str()-Zeiger außerhalb dieses Kontexts gespeichert und verwendet wird, wird das Verhalten undefiniert, da das temporäre std::string-Objekt möglicherweise bereits zerstört wurde.

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

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage