Maison > développement back-end > C++ > Pourquoi l'appel de `std::string.c_str()` sur une fonction renvoyant une chaîne par valeur entraîne-t-il des problèmes ?

Pourquoi l'appel de `std::string.c_str()` sur une fonction renvoyant une chaîne par valeur entraîne-t-il des problèmes ?

Linda Hamilton
Libérer: 2024-10-27 06:44:29
original
614 Les gens l'ont consulté

Why Does Calling `std::string.c_str()` on a Function Returning a String by Value Lead to Problems?

Pourquoi appeler std::string.c_str() sur une fonction qui renvoie une chaîne peut entraîner des problèmes

Lors du traitement des chaînes dans C , comprendre la durée de vie des objets temporaires est crucial. Un malentendu courant se produit lors de l'appel de std::string.c_str() sur la valeur de retour d'une fonction qui renvoie une chaîne par valeur.

Dans l'extrait de 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;
}</code>
Copier après la connexion

Un on pourrait s'attendre à ce que la fonction getString() renvoie une copie de la chaîne str stockée dans la portée de la fonction, permettant à cStr de contenir une référence valide à celle-ci.

Cependant, ce n'est pas le cas. En C , la valeur de retour d'un appel de fonction est un objet temporaire. Lorsqu'un objet temporaire est lié à une référence ou utilisé pour initialiser un objet nommé, sa durée de vie est prolongée. Sinon, il est détruit à la fin de l'expression complète dans laquelle il a été créé.

Dans le code ci-dessus, la valeur de retour de getString() est un objet temporaire de type std::string, qui est renvoyé par valeur. Étant donné que cStr ne se lie pas à une référence et n'initialise pas un objet nommé, l'objet temporaire std::string est détruit après l'évaluation de l'expression getString(). Cela signifie que cStr pointe désormais vers la mémoire désallouée, ce qui la rend dangereuse à utiliser.

Pour éviter ce problème, envisagez de prolonger la durée de vie de l'objet temporaire en le copiant dans un objet nommé ou en le liant à une référence, telle que :

<code class="cpp">std::string str = getString();
const char* cStr = str.c_str();</code>
Copier après la connexion

ou :

<code class="cpp">const std::string&amp; ref = getString();
const char* cStr = ref.c_str();</code>
Copier après la connexion

Alternativement, vous pouvez utiliser le pointeur renvoyé par c_str() immédiatement sans le stocker dans une variable :

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