Maison > développement back-end > C++ > le corps du texte

## Pourquoi l'appel de `std::string.c_str()` sur une chaîne renvoyée entraîne-t-il un comportement non défini ?

Linda Hamilton
Libérer: 2024-10-25 11:29:02
original
590 Les gens l'ont consulté

## Why Does Calling `std::string.c_str()` on a Returned String Lead to Undefined Behavior?

Pourquoi l'appel de std::string.c_str() sur une chaîne renvoyée échoue-t-il ?

Considérez le code suivant :

<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; // Outputs garbage
}</code>
Copier après la connexion

Comme vous vous en doutez, getString() renvoie une copie de sa chaîne locale, la gardant apparemment en vie dans main(). Cependant, le code imprime des ordures de manière inattendue. Cela soulève la question : quand et pourquoi la chaîne renvoyée est-elle détruite ?

La réponse réside dans la nature des temporaires en C . getString() renvoie une std::string temporaire qui est créée dans la fonction et détruite à la fin de l'instruction dans laquelle elle est renvoyée. Cela signifie qu'au moment où cStr pointe vers le tableau de caractères sous-jacent de la chaîne, le temporaire a déjà été détruit et cStr devient un pointeur suspendu, conduisant à un comportement indéfini.

Pour résoudre ce problème, le temporaire renvoyé peut être lié à une variable ou une référence nommée, prolongeant ainsi sa durée de vie jusqu'à la fin de la portée de la référence :

<code class="cpp">std::string s1 = getString(); // s1 is initialized with a copy of the temporary
auto& s2 = getString(); // s2 binds to the temporary by reference</code>
Copier après la connexion

Alternativement, le pointeur vers le tableau de caractères sous-jacent peut être utilisé avant que le temporaire ne soit détruit :

<code class="cpp">std::cout << getString().c_str() << std::endl; // Temporary is destroyed after the expression completes</code>
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!