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

## 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
Linda Hamiltonoriginal
2024-10-25 11:29:02591parcourir

## 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>

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>

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>

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!

Déclaration:
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