Verstehen der Lebensdauer von std::string::c_str()
In der Programmierung, Schnittstelle zu Legacy-Code, der mit const char arbeitet Variablen können eine Herausforderung darstellen, insbesondere wenn Ihre Anwendung hauptsächlich std::string-Objekte verwendet. Der Zugriff auf die zugrunde liegenden const char Daten einer std::string-Instanz über c_str() kann diese Anforderung erfüllen, wirft jedoch Bedenken hinsichtlich der Lebensdauer des Ergebnisses auf.
Bei der Verwendung von c_str() ist es unbedingt erforderlich, dies zu verstehen die Dauer des zurückgegebenen Werts. Das c_str()-Ergebnis wird ungültig, wenn der std::string, von dem es abgeleitet ist, zerstört wird oder wenn eine nicht konstante Funktion des Strings aufgerufen wird. Daher erfordert die Beibehaltung des c_str()-Ergebnisses häufig das Erstellen einer Kopie.
Beachten Sie den folgenden Codeausschnitt:
std::string server = "my_server"; std::string name = "my_name"; Foo foo; foo.server = server.c_str(); foo.name = name.c_str(); // We use foo use_foo(foo); // Foo is about to be destroyed, before name and server
In diesem Beispiel werden die c_str()-Ergebnisse in einem begrenzten Umfang verwendet , wobei die entsprechenden std::string-Objekte intakt bleiben. Daher gelten die c_str()-Werte während der gesamten Ausführung dieses Blocks als gültig. Allerdings können externe Funktionen, die über Zeiger (wie use_foo()) oder Destruktoren (~Foo()) aufgerufen werden, die Gültigkeit dieser c_str()-Ergebnisse beeinträchtigen.
Um die sichere Verwendung von c_str()-Ergebnissen zu gewährleisten, Es wird im Allgemeinen empfohlen, eine separate Kopie zu erstellen, wenn Sie beabsichtigen, sie über die Lebensdauer der ursprünglichen std::string-Objekte hinaus zu speichern. Dies stellt die Erhaltung der zugrunde liegenden Daten sicher und verringert das Risiko undefinierten Verhaltens.
Das obige ist der detaillierte Inhalt vonWie lange bleibt der Zeiger „std::string::c_str()' gültig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!