Maison  >  Article  >  développement back-end  >  Voici quelques options de titre qui correspondent au format question-réponse et décrivent avec précision le contenu de l'article : **Option 1 (court et direct) :** * **Pourquoi appeler `std::string.c_str()` sur un Re

Voici quelques options de titre qui correspondent au format question-réponse et décrivent avec précision le contenu de l'article : **Option 1 (court et direct) :** * **Pourquoi appeler `std::string.c_str()` sur un Re

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 09:23:02675parcourir

Here are a few title options that fit the question-answer format and accurately describe the article's content:

**Option 1 (Short & Direct):**

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

**Option 2 (M

Pourquoi l'appel de std::string.c_str() sur une fonction renvoyant une chaîne échoue

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>

Intuitivement, on pourrait s'attendre à ce que la chaîne temporaire renvoyée par getString() reste valide dans la portée de main(). Cependant, c'est incorrect.

Le problème réside dans la durée de vie des objets temporaires en C . Un objet temporaire est détruit à la fin de l'expression dans laquelle il est créé, sauf s'il est lié à une référence ou utilisé pour initialiser un objet nommé. Dans ce cas, getString() renvoie une chaîne temporaire, qui est détruite à la fin de l'expression dans main().

Par conséquent, cStr contient un pointeur suspendu et son utilisation peut conduire à un comportement indéfini. Pour éviter ce problème, on peut utiliser une variable nommée ou une référence pour garantir la validité de la chaîne renvoyée. Par exemple :

<code class="cpp">std::string returnedString = getString();
const char* cStr = returnedString.c_str();
std::cout << cStr << std::endl; // Safe</code>

Alternativement, la chaîne temporaire peut être utilisée directement sans l'attribuer à une variable :

<code class="cpp">std::cout << getString().c_str() << std::endl; // Also safe</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