Maison  >  Article  >  développement back-end  >  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
Linda Hamiltonoriginal
2024-10-27 06:44:29414parcourir

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>

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>

ou :

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

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>

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