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