Bewahrung der Integrität temporärer Strings: Erkundung von std::string::c_str()
Im Bereich von C sind die Sicherheit und Die Gültigkeit von Code mit temporären Zeichenfolgen gibt häufig Anlass zur Sorge. Eine dieser Fragen betrifft die Verwendung von std::string::c_str() im Kontext temporärer Zeichenfolgen.
Die Frage:
Bedenken Sie den folgenden Codeausschnitt:
void consumer(char const* p) { std::printf("'%s'", p); } std::string random_string_generator(); consumer(random_string_generator().c_str());
Das Dilemma ergibt sich aus der möglichen Zerstörung des temporären std::string-Objekts nach dem Abrufen seines c_str()-Zeigers. Stellt dies gemäß dem C-Standard ein Gültigkeitsrisiko dar?
Die Antwort:
Das Verständnis der Lebensdauer von Provisorien ist von entscheidender Bedeutung. In C werden temporäre Dateien am Ende des vollständigen Ausdrucks zerstört, nicht unmittelbar nach ihrer Erstellung oder vor ihrer Verwendung. Daher bleibt im angegebenen Code das temporäre std::string-Objekt bis zum Abschluss des Funktionsaufrufs von Consumer() bestehen.
Der über std::string::c_str() erhaltene Zeiger bleibt gültig bis Jede nicht konstante Operation wird für das Zeichenfolgenobjekt ausgeführt oder es wird zerstört. Da das String-Objekt temporär ist und am Ende des vollständigen Ausdrucks zerstört wird, ist der Code tatsächlich wohlgeformt und gültig.
Historische Fußnote:
Es ist wichtig Beachten Sie, dass das oben beschriebene Verhalten mit C 98 standardisiert wurde. Zuvor variierte die Lebensdauer von Provisorien je nach Compiler-Implementierung. Mit zunehmender Reife des Standards wurde das Verhalten jedoch einheitlich definiert, um die Konsistenz aller Compiler sicherzustellen.
Das obige ist der detaillierte Inhalt vonIst die Verwendung von „std::string::c_str()' mit einem temporären String in C sicher?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!