¿Por qué se std :: strstream obsoleto?
-
26-09-2019 - |
Pregunta
Hace poco descubrió que std::strstream
ha sido desaprobado en favor de std::stringstream
. Ha sido un tiempo desde que he utilizado, pero hizo lo que tenía que hacer en el momento, por lo que se sorprendió al escuchar de su desaprobación.
Mi pregunta es por qué se tomó esta decisión, y qué ventajas tiene std::stringstream
disponer que están ausentes de std::strstream
?
Solución
El strstream
devuelve un char *
que era muy difícil de manejar, ya que en ninguna parte se afirma que la forma en que se había asignado. Era por lo tanto imposible saber si se debe eliminar o llame sin () en él o hacer algo completamente distinto. Acerca de la única manera realmente satisfactoria para cancelar la asignación fue de la mano de nuevo a la strstream
través de la función freeze()
. Esto fue lo suficientemente no obvio, que mucha gente se equivocaron. El stringstream
devuelve un objeto de cadena que gestiona en sí, que es mucho menos propenso a errores.
También estaba el problema de tener que utilizar ends
de interrumpir la cadena, pero creo que el problema de cancelación de asignación fue la razón principal de desaprobación.
Otros consejos
Más fácil de entender la gestión de memoria. (¿Puede alguien recordar quién es responsable de liberar la memoria asignada y en qué condiciones?)
(Tenga en cuenta que como strstream todavía proporcionan algo que no está disponible en otros lugares, continuará a estar presentes en C ++ 0X - al menos la última vez que revisé el proyecto fue).
A strstream
construye una char *
. Un std::stringstream
construye una std::string
. Me suponer strstream
s están en desuso becuase a la posibilidad de un desbordamiento de memoria, algo que impide std::string
automáticamente.
Desde un punto de vista personal en más de una ocasión me he visto corrupción de memoria oscuros que tardaban días o semanas para localizar y finalmente descendió a uso de strstream
. Tan pronto como se sustituyó por stringstream
las corrupciones desaparecieron y yo no hacer más preguntas! Eso fue suficiente para mí.