Heim > Backend-Entwicklung > C++ > Warum bleibt „c_str()' einer temporären C-Zeichenfolge nach dem Funktionsaufruf gültig?

Warum bleibt „c_str()' einer temporären C-Zeichenfolge nach dem Funktionsaufruf gültig?

Mary-Kate Olsen
Freigeben: 2024-12-16 18:57:21
Original
179 Leute haben es durchsucht

Why Does a C   Temporary String's `c_str()` Remain Valid After the Function Call?

Lifetime of Temporaries Revisited

Das bereitgestellte Code-Snippet zeigt das faszinierende Verhalten temporärer Objekte in C. Bedenken Sie Folgendes:

std::string foo() {
  std::string out = something...;
  return out;
}

void bar(const char* ccp) {
  // Do something with the string...
}

bar(foo().c_str());
Nach dem Login kopieren

Es stellt sich die Frage: Warum ist der „c_str()“-Zeiger des von foo() zurückgegebenen Temporärs noch gültig? Der gesunde Menschenverstand könnte vorschlagen, dass die temporäre Datei zerstört werden sollte, bevor bar() aufgerufen wird. Dies ist jedoch nicht der Fall.

Gemäß dem C-Standard verlängert sich die Lebensdauer eines temporären Objekts, bis die Auswertung des vollständigen Ausdrucks, der lexikalisch den R-Wert enthält, der es erstellt hat, abgeschlossen ist. Dies bedeutet, dass im angegebenen Code das von foo() zurückgegebene temporäre Objekt am Leben bleibt, bis der Aufruf von bar() abgeschlossen ist.

Um dieses Konzept zu veranschaulichen, berücksichtigen Sie Folgendes:

____________________   full-expression ranges from 'b' to last ')'
bar(foo().c_str());
     ^^^^^          ^
       |            |
     birth       funeral
Nach dem Login kopieren

Das temporäre Objekt wird erstellt, wenn foo() aufgerufen wird (bezeichnet als „Geburt“). Es bleibt während der gesamten Auswertung des vollständigen Ausdrucks aktiv, in diesem Fall der Funktionsaufruf bar(foo().c_str()). Sobald der Funktionsaufruf abgeschlossen ist, wird das temporäre Objekt zerstört (bezeichnet als „Beerdigung“).

Das obige ist der detaillierte Inhalt vonWarum bleibt „c_str()' einer temporären C-Zeichenfolge nach dem Funktionsaufruf gültig?. 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