2017-10-20 25 views
0

J'ai ce bloc de code tel qu'écrit avec strstream. Et je l'ai converti en sstream comme ci-dessous. Je ne suis pas sûr, mais je pense que printStream->str() retourne un objet chaîne avec une copie (temporaire) du contenu dans le tampon de flux pointé par printStream, puis vous invoquez c_str() dessus et obtenir un const char *, puis rejetant la constance, puis renvoyer le pointeur en dehors de la portée de la fonction. Je pense que puisque c'est une valeur temporaire que vous revenez de printStream->str(), vous utiliserez un pointeur pour libérer de la mémoire en dehors de cette fonction. Comment dois-je faire cela?Conversion d'un conflit strstream en flux sstream à propos de c_str()

char * FieldData::to_string() const 
{ 
    if(printStream) 
    return printStream->str(); 
    FieldData* notConst = (FieldData*) this; 
    notConst->printStream = new std::ostrstream; 
    // check heap sr60315556 
    if (notConst->printStream == NULL) 
    return NULL; 
    *(notConst->printStream) << "Invalid Field Type"; 
    *(notConst->printStream) << '\0'; 
    return printStream->str(); 
} 

char * FieldData::to_string() const 
{ 
    if(printStream) 
    return const_cast<char *>(printStream->str().c_str()); 
    FieldData* notConst = (FieldData*) this; 
    notConst->printStream = new std::ostringstream; 
    // check heap sr60315556 
    if (notConst->printStream == NULL) 
    return NULL; 
    *(notConst->printStream) << "Invalid Field Type"; 
    *(notConst->printStream) << '\0'; 
    return const_cast<char *>(printStream->str().c_str()); 
} 
+1

Ne pas utiliser 'new', ne pas utiliser de style C jette, ne pas utiliser' const_cast' * en particulier * pour modifier la variable , n'utilisez pas de chaînes de style C, ne renvoyez pas de pointeurs vers la mémoire déjà désallouée. En fait, je suis presque sûr qu'il serait plus facile de recommencer à zéro que de réparer ce code. – milleniumbug

+0

par exemple comment devrais-je changer mon code? return const_cast (printStream-> str(). c_str()); –

Répondre

1

Modifier le type de retour à std::string et retourner un objet std::string directement.

+0

comment dois-je faire? par exemple, comment puis-je modifier cette ligne return const_cast (printStream-> str(). c_str()); –

1

Je pense qu'une fonction appelée to_string vraiment, vraiment, vraiment devrait renvoyer un std::string.

Et puis tout cela indésirable peut être remplacé par

std::string FieldData::to_string() const 
{ return "Invalid Field Type"; }