Heim > Backend-Entwicklung > C++ > Hauptteil

Warum führt der Aufruf von „std::string.c_str()' für eine Funktion, die einen String nach Wert zurückgibt, zu Problemen?

Linda Hamilton
Freigeben: 2024-10-27 06:44:29
Original
413 Leute haben es durchsucht

Why Does Calling `std::string.c_str()` on a Function Returning a String by Value Lead to Problems?

Warum der Aufruf von std::string.c_str() für eine Funktion, die einen String zurückgibt, zu Problemen führen kann

Beim Umgang mit Strings in C ist das Verständnis der Lebensdauer temporärer Objekte von entscheidender Bedeutung. Ein häufiges Missverständnis tritt auf, wenn std::string.c_str() für den Rückgabewert einer Funktion aufgerufen wird, die eine Zeichenfolge nach Wert zurückgibt.

Im folgenden Codeausschnitt:

<code class="cpp">std::string getString() {
    std::string str("hello");
    return str;
}

int main() {
    const char* cStr = getString().c_str();
    std::cout << cStr << std::endl;
}</code>
Nach dem Login kopieren

Eins könnte erwarten, dass die Funktion getString() eine Kopie der im Funktionsbereich gespeicherten Zeichenfolge str zurückgibt, sodass cStr einen gültigen Verweis darauf enthalten kann.

Dies ist jedoch nicht der Fall. In C ist der Rückgabewert eines Funktionsaufrufs ein temporäres Objekt. Wenn ein temporäres Objekt an eine Referenz gebunden oder zum Initialisieren eines benannten Objekts verwendet wird, verlängert sich seine Lebensdauer. Andernfalls wird es am Ende des vollständigen Ausdrucks, in dem es erstellt wurde, zerstört.

Im obigen Code ist der Rückgabewert von getString() ein temporäres Objekt vom Typ std::string, das zurückgegeben wird nach Wert. Da cStr nicht an eine Referenz bindet oder ein benanntes Objekt initialisiert, wird das temporäre std::string-Objekt zerstört, nachdem der Ausdruck getString() ausgewertet wurde. Dies bedeutet, dass cStr jetzt auf freigegebenen Speicher verweist, was die Verwendung unsicher macht.

Um dieses Problem zu vermeiden, sollten Sie die Lebensdauer des temporären Objekts verlängern, indem Sie es in ein benanntes Objekt kopieren oder es an eine Referenz binden, z. B :

<code class="cpp">std::string str = getString();
const char* cStr = str.c_str();</code>
Nach dem Login kopieren

oder:

<code class="cpp">const std::string&amp; ref = getString();
const char* cStr = ref.c_str();</code>
Nach dem Login kopieren

Alternativ können Sie den von c_str() zurückgegebenen Zeiger sofort verwenden, ohne ihn in einer Variablen zu speichern:

<code class="cpp">std::cout << getString().c_str() << std::endl;</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum führt der Aufruf von „std::string.c_str()' für eine Funktion, die einen String nach Wert zurückgibt, zu Problemen?. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!