web-dev-qa-db-fra.com

Pourquoi std :: strstream est-il déconseillé?

J'ai récemment découvert que std::strstream a été déconseillé au profit de std::stringstream. Cela fait un moment que je ne l'ai pas utilisé, mais il a fait ce que je devais faire à l'époque, alors j'ai été surpris d'entendre sa dépréciation.

Ma question est de savoir pourquoi cette décision a été prise et quels sont les avantages std::stringstream prévoir qui sont absents de std::strstream?

68
andand

Le strstream a renvoyé un char * Qui était très difficile à gérer, car il n'était indiqué nulle part comment il avait été alloué. Il était donc impossible de savoir si vous devez le supprimer ou appeler free () dessus ou faire autre chose entièrement. La seule façon vraiment satisfaisante de le désallouer était de le rendre à strstream via la fonction freeze(). Ce n'était pas suffisamment évident, que beaucoup de gens se sont trompés. stringstream renvoie un objet chaîne qui se gère lui-même, ce qui est beaucoup moins sujet aux erreurs.

Il y avait aussi le problème de devoir utiliser ends pour terminer la chaîne, mais je crois que le problème de désallocation était la principale raison de la dépréciation.

92
anon

Gestion de la mémoire plus facile à comprendre. (Quelqu'un peut-il se rappeler qui est responsable de la libération de la mémoire allouée et dans quelles conditions?)

(Notez que comme strstream fournit toujours quelque chose qui n'est pas disponible ailleurs, il continuera d'être présent en C++ 0X - au moins la dernière fois que j'ai vérifié le brouillon).

15
AProgrammer

Un strstream construit un char *. UNE std::stringstream construit un std::string. Je suppose que strstreams sont obsolètes à cause du potentiel d'un débordement de tampon, quelque chose que std::string empêche automatiquement.

11
Ken Bloom

D'un point de vue personnel, à plus d'une occasion, j'ai vu des altérations de mémoire obscures qui ont pris des jours ou des semaines pour être retrouvées et qui ont fini par se résumer à l'utilisation de strstream. Dès qu'il a été remplacé par stringstream les corruptions ont disparu et je n'ai plus posé de questions! C'en était assez pour moi.

7
Component 10