Maison >développement back-end >C++ >Pourquoi `c_str()` renvoie-t-il des déchets lorsqu'il est utilisé directement sur des chaînes de retour de fonction ?
Dévoilement de l'énigme de c_str() dans les chaînes de retour de fonction
La fonction c_str() est un outil puissant pour convertir un std :: objet chaîne dans un caractère const*. Cependant, lorsqu'elle est appliquée directement à la valeur de retour d'une fonction qui renvoie une chaîne, elle peut donner des résultats mystérieux.
L'essence du problème
Considérez le code suivant extrait :
string str = SomeFunction(); const char* strConverted = str.c_str(); // strConverted stores the value of the string properly const char* charArray= SomeFunction().c_str(); // charArray stores garbage value static string SomeFunction() { string str; // does some string stuff return str; }
Dans ce scénario, strConverted contient correctement la valeur de la chaîne renvoyée. Cependant, charArray est rempli de charabia. Pourquoi ce comportement déroutant se produit-il ?
Plonger dans les temporaires
La clé réside dans la nature de la valeur de retour. Lorsque SomeFunction() renvoie une chaîne, celle-ci est en fait un objet temporaire. Les objets temporaires ont une durée de vie limitée, se terminant généralement à la fin du bloc de code actuel.
Le piège des pointeurs pendants
c_str() renvoie un pointeur vers le tampon interne de la chaîne. Lorsqu'il est appelé directement sur une chaîne temporaire (par exemple, SomeFunction().c_str()), le pointeur renvoyé devient un pointeur pendant lorsque l'objet temporaire disparaît rapidement. Ce pointeur suspendu est ce qui afflige charArray avec des données peu fiables.
La solution : prolonger la durée de vie
Pour éviter ces périls, il est impératif de prolonger la durée de vie de la chaîne temporaire. Une approche simple consiste à l'attribuer à une nouvelle variable de chaîne, comme démontré dans l'exemple str_copy. Ce faisant, l'objet chaîne est conservé, garantissant un pointeur valide de c_str().
En conclusion
Lorsque vous traitez des chaînes de retour de fonction, la prudence est de mise lorsque en utilisant c_str() directement sur la valeur de retour. Pour éviter les pièges des pointeurs suspendus, attribuez la valeur de retour à une nouvelle variable chaîne avant d'appeler c_str(). Cela garantit un pointeur stable vers le contenu de la chaîne.
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!