Maison > développement back-end > C++ > Pourquoi `stringstream.str().c_str()` provoque-t-il une erreur de mémoire en C ?

Pourquoi `stringstream.str().c_str()` provoque-t-il une erreur de mémoire en C ?

Mary-Kate Olsen
Libérer: 2024-11-15 05:01:02
original
1077 Les gens l'ont consulté

Why Does `stringstream.str().c_str()` Cause a Memory Error in 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;
}
Copier après la connexion

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

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 (???)
Copier après la connexion

Toutes les instructions d'impression fonctionnent désormais correctement car :

  • cstr et cstr2どちらも有効な文字列ポインタです。
  • ss.str().c_str() est une chaîne temporaire liée à une référence const, prolongeant sa durée de vie.

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 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