Comprendre les conversions Stringstream, String et char*
Une confusion courante dans la programmation implique l'interaction entre stringstream, string et char conversions. Cet article vise à clarifier où la chaîne renvoyée par stringstream.str().c_str() réside en mémoire et pourquoi elle ne peut pas être directement affectée à un const char.
Lors de l'utilisation de stringstream, le str( ) renvoie un objet chaîne temporaire qui existe uniquement dans l'expression dans laquelle il est appelé. Cet objet chaîne est généralement créé sur la pile et est détruit une fois l'expression terminée.
Examinons l'exemple de code fourni :
#include <string> #include <sstream> #include <iostream> using namespace std; 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; }
Le problème survient lorsque nous essayons d'attribuer le résultat de stringstream.str().c_str() au const char* cstr2. Étant donné que la chaîne renvoyée est temporaire, elle est détruite une fois l'expression terminée, ce qui rend cstr2 pointant vers un pointeur suspendu. Par conséquent, l'impression de cstr2 génère des déchets.
Résolution du problème :
Pour éviter ce problème, nous pouvons soit copier la chaîne temporaire dans un objet chaîne permanent et obtenir son Chaîne de style C ou liez la chaîne temporaire à une référence const, prolongeant ainsi sa durée de vie :
// Copy to a permanent string const std::string tmp = stringstream.str(); const char* cstr = tmp.c_str(); // Bind to a const reference { const std::string& tmp = stringstream.str(); const char* cstr = tmp.c_str(); }
Dans l'exemple de code modifié, cstr et cstr2 pointent tous deux vers chaînes de style C valides qui existent pour la durée de vie de l'objet chaîne const. En conséquence, les deux chaînes peuvent être imprimées correctement.
Il est important de noter que la liaison de la chaîne temporaire à une référence const est généralement préférable car elle évite les copies inutiles et permet une solution plus efficace et plus concise.
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!