Maison > développement back-end > C++ > Pourquoi l'attribution de `stringstream.str().c_str()` à un `const char*` conduit-elle à un pointeur suspendu, et comment ce problème peut-il être résolu ?

Pourquoi l'attribution de `stringstream.str().c_str()` à un `const char*` conduit-elle à un pointeur suspendu, et comment ce problème peut-il être résolu ?

Linda Hamilton
Libérer: 2024-11-22 07:17:14
original
225 Les gens l'ont consulté

Why does assigning `stringstream.str().c_str()` to a `const char*` lead to a dangling pointer, and how can this issue be resolved?

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;
}
Copier après la connexion

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&amp; tmp = stringstream.str();   
  const char* cstr = tmp.c_str();
}
Copier après la connexion

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!

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