Maison >développement back-end >C++ >Pourquoi `stringstream.str().c_str()` provoque-t-il une erreur de mémoire en C ?
Confusion sur les conversions entre stringstream, string et char*
Ce problème survient lors de la conversion de la chaîne obtenue à partir de stringstream.str(). c_str() dans un const char*. Comprendre la gestion de la mémoire et la durée de vie de la chaîne renvoyée est crucial pour éviter les erreurs potentielles.
L'extrait de code illustre le problème :
#include <string> #include <sstream> #include <iostream> int main() { stringstream ss("this is a string\n"); string str(ss.str()); const char* cstr1 = str.c_str(); const char* cstr2 = ss.str().c_str(); cout << cstr1 // Prints correctly << cstr2; // ERROR, prints out garbage system("PAUSE"); return 0; }
L'hypothèse selon laquelle stringstream.str().c_str( ) peut être attribué à un const char* est incorrect. Cela conduit à un bug où cstr2 imprime des déchets.
Comprendre la gestion de la mémoire
stringstream.str() renvoie un objet chaîne temporaire qui n'est valide que jusqu'à la fin de l’expression actuelle. Une fois l'expression terminée, l'objet temporaire est détruit et le pointeur vers ses données (renvoyé par c_str()) devient invalide.
Résoudre l'erreur
Pour résoudre Pour résoudre ce problème, l'objet chaîne temporaire doit être stocké dans une variable distincte, telle que :
const std::string tmp = stringstream.str(); const char* cstr2 = tmp.c_str();
En stockant l'objet temporaire dans tmp, la durée de vie du pointeur est prolongée et l'impression de cstr2 fonctionne désormais correctement.
Explication des points bonus
Dans le bloc de code modifié :
cout << cstr // Prints correctly << ss.str().c_str() // Prints correctly << cstr2; // Prints correctly (???)
Toutes les instructions d'impression fonctionnent désormais correctement car :
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!