Heim > Backend-Entwicklung > C++ > Warum bleibt eine temporäre Zeichenfolge gültig, nachdem die Funktion, die sie erstellt hat, zurückkehrt?

Warum bleibt eine temporäre Zeichenfolge gültig, nachdem die Funktion, die sie erstellt hat, zurückkehrt?

Patricia Arquette
Freigeben: 2024-12-14 16:31:11
Original
104 Leute haben es durchsucht

Why Does a Temporary String Remain Valid After the Function That Created It Returns?

Lifetime of Temporaries Revisited

Der in der ursprünglichen Frage bereitgestellte Codeausschnitt zeigt ein scheinbar paradoxes Verhalten, bei dem die von foo() zurückgegebene temporäre Zeichenfolge bleibt auch dann gültig, wenn es angeblich bei der Eingabe von bar() zerstört wurde.

Entgegen der Annahme ist das temporäre Objekt nicht vollständig zerstört, wenn die Funktion, die es erstellt hat, abgeschlossen ist. Stattdessen verlängert sich seine Lebensdauer, bis der gesamte Ausdruck, der das Temporäre enthält, vollständig ausgewertet ist.

Um dieses Konzept zu veranschaulichen, zerlegen wir den Code in seine Komponenten:

  • Der temporäre Ausgang ist erstellt in der foo()-Funktion.
  • Der Ausdruck foo().c_str() greift dann auf das c_str()-Mitglied von out zu und gibt ein temporäres const char* zurück Zeiger.

Gemäß den C-Sprachregeln bleibt das von foo().c_str() erzeugte const char* temporary bestehen, bis der vollständige Ausdruck bar(foo().c_str()) vollständig ist ausgewertet. Dies bedeutet, dass der Zeiger auch nach Abschluss der Ausführung von foo() gültig bleibt.

Um dieses Verhalten zu visualisieren, stellen Sie sich die folgende Zeitleiste vor:

|--------------------|-----------|-----------|-----------|
|                    | birth    | funeral    |           |
|                    |  ^^^    |  ^^^^     |           |
|--------------------|           |           |           |
|                     | bar()     |           |           |
|                     |           |           |           |
|--------------------|           |           |           |
|                     |           |           |  evaluated |
|                     |           |           |  bar()     |
|--------------------|           |           |           |
|                     |           | foo()      |           |
|                     |           |           |           |
|--------------------|           |           |           |
Nach dem Login kopieren

Die temporären Objekte (der String out und der const char*-Zeiger) werden erstellt, wenn der Ausdruck foo().c_str() ausgewertet wird, und bleiben bestehen, bis der gesamte Ausdruck bar(foo().c_str()) ausgewertet wurde. Dadurch wird sichergestellt, dass der für bar() bereitgestellte Zeiger immer noch gültig ist, wenn die Funktion versucht, auf die Zeichenfolge zuzugreifen.

Daher ist es richtig anzunehmen, dass die von foo() zurückgegebene temporäre Datei nach dem Aufruf von zerstört wird bar() wird abgeschlossen, da dies das Ende des vollständigen Ausdrucks markiert, der das Temporäre enthält.

Das obige ist der detaillierte Inhalt vonWarum bleibt eine temporäre Zeichenfolge gültig, nachdem die Funktion, die sie erstellt hat, zurückkehrt?. 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