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

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

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!