c++ - print - ¿Por qué se desactivó std:: strstream?
stringstream mystr (4)
Recientemente descubrí que std::strstream
ha quedado en desuso en favor de std::stringstream
. Ha pasado un tiempo desde que lo usé, pero hizo lo que tenía que hacer en ese momento, por lo que me sorprendió escuchar su desaprobación.
Mi pregunta es por qué se tomó esta decisión, y qué beneficios ofrece std::stringstream
que están ausentes de std::strstream
?
A strstream
crea un char *
. Un std::stringstream
crea una std::string
. Supongo que strstream
s están en desuso debido a la posibilidad de un desbordamiento de búfer, algo que std::string
previene automáticamente.
Desde una perspectiva personal en más de una ocasión, he visto corrupciones de memoria oscuras que tardaron días o semanas en rastrear y, finalmente, terminaron con el uso de strstream
. ¡Tan pronto como fue reemplazado con stringstream
las corrupciones desaparecieron y no hice más preguntas! Eso fue suficiente para mi.
La strstream
devolvió un char *
que era muy difícil de manejar, ya que en ninguna parte se indicaba cómo se había asignado. Por lo tanto, era imposible saber si debería eliminarlo o llamar a free () o hacer algo completamente diferente. La única manera realmente satisfactoria de desasignarlo fue devolvérselo a la strstream
través de la función freeze()
. Esto fue lo suficientemente obvio, que mucha gente lo entendió mal. La stringstream
devuelve un objeto de cadena que se gestiona a sí mismo, que es mucho menos propenso a errores.
También estaba la cuestión de tener que usar los ends
para terminar la cadena, pero creo que el problema de desasignación fue la razón principal de la depreciación.
Más fácil de entender la gestión de la memoria. (¿Puede alguien recordar quién es responsable de liberar la memoria asignada y en qué condiciones?)
(Tenga en cuenta que como strstream aún proporciona algo que no está disponible en otro lado, seguirá estando presente en C ++ 0X, al menos la última vez que verifiqué el borrador).