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());
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!