Maison > développement back-end > C++ > Pourquoi l'attribution de `stringstream.str().c_str()` à un `const char*` conduit-elle à une sortie de déchets ?

Pourquoi l'attribution de `stringstream.str().c_str()` à un `const char*` conduit-elle à une sortie de déchets ?

Barbara Streisand
Libérer: 2024-11-16 17:16:03
original
517 Les gens l'ont consulté

Why Does Assigning `stringstream.str().c_str()` to a `const char*` Lead to Garbage Output?

Confusion de conversion stringstream, string et char*

Cet article aborde le problème de l'attribution d'un const char* à la chaîne renvoyée par stringstream .str().c_str().

Problème Explication

stringstream.str() construit un objet chaîne temporaire qui est détruit à la fin de l'expression. Lors de l'attribution de cette chaîne temporaire à un const char*, le pointeur fait référence à la chaîne supprimée, ce qui entraîne une sortie inutile.

Voici un exemple :

stringstream ss("this is a string\n");
const char* cstr = ss.str().c_str();
Copier après la connexion

Dans le code ci-dessus, après l'expression se termine, la chaîne temporaire créée par stringstream.str() est supprimée, ce qui fait que cstr pointe vers une mémoire invalide location.

Solution

Pour résoudre ce problème, la chaîne temporaire doit être copiée dans un autre objet chaîne avant de la convertir en un caractère const*. Ceci peut être réalisé en utilisant l'approche suivante :

string tmp = stringstream.str();
const char* cstr = tmp.c_str();
Copier après la connexion

Explication des points bonus

Le code modifié suivant imprime correctement les chaînes :

cout << cstr << ss.str().c_str() << cstr2;
Copier après la connexion

Cette modification fonctionne car :

  • cstr pointe vers un const char* qui a été créé à partir d'un objet chaîne avec une durée de vie connue.
  • ss.str().c_str() renvoie un const char* qui pointe vers la chaîne temporaire, qui est désormais protégée par la référence const renvoyée par stringstream.str()
  • cstr2 pointe vers la même chaîne temporaire que ss.str().c_str(), mais ce n'est pas const, elle peut donc être assignée à un char* temporaire qui est détruit à la fin du cout déclaration.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal