Maison > développement back-end > C++ > 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
Libérer: 2024-10-25 09:23:02
original
856 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal