Maison  >  Article  >  développement back-end  >  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
Barbara Streisandoriginal
2024-11-16 17:16:03465parcourir

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();

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();

Explication des points bonus

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

cout << cstr << ss.str().c_str() << cstr2;

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!

Déclaration:
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