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
?
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.
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).
Un strstream
construit un char *
. UNE std::stringstream
construit un std::string
. Je suppose que strstream
s sont obsolètes à cause du potentiel d'un débordement de tampon, quelque chose que std::string
empêche automatiquement.
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.