2010-05-12 11 views
64

Recientemente he descubierto que std::strstream ha sido desaprobado 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.¿Por qué se desactivó std :: strstream?

Mi pregunta es por qué se tomó esta decisión, y qué beneficios proporciona std::stringstream que faltan en std::strstream?

+0

@ Chris Lively: ¿Estás diciendo que era sólo una cuestión de convención de nombres, o simplemente estás de broma? – andand

+0

no sé a ciencia cierta, pero este URL encontrado a través de Google pueden ayudar: http://bytes.com/topic/c/answers/158338-strstream-depreciation –

+1

@andand comprobar C++ excepcional, ha explicado muy bien allí. –

Respuesta

88

El strstream devolvió un char * que era muy difícil de administrar, 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 devolverlo al strstream a través de la función freeze(). Esto fue lo suficientemente obvio, que mucha gente lo entendió mal. El 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 ends para terminar la cadena, pero creo que el problema de la desasignación fue la razón principal de desaprobación.

+1

un descriptor de acceso guardia de amigo-bloqueo habría resuelto este problema sin hacer copias de copias de los datos, que es la solución actual. {std :: bufferguard f (mystream); printf ("% s \ n", f.str()); } –

11

Un strstream construye un char *. A std::stringstream construye un std::string. Supongo strstream s están en desuso becuase a la posibilidad de un desbordamiento de memoria, algo que std::string impide automáticamente.

+0

strstream en realidad no construir el char * ... es simplemente pega un nulo en el extremo del buffer que internamente asignó. el problema era la extraña "congelación" de los accesores ... que debería haberse implementado como guardia. –

15

más fácil de entender la gestión de memoria. (¿Puede alguien recordar quién es el 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 otros lugares, seguirá estando presente en C++ 0X - en por lo menos la última vez que revisé el borrador fue).

+5

Si proporciona el buffer, usted es responsable de liberarlo. Si proporcionó el buffer, lo liberará, pero debes recordar descongelar el stream o no lo hará. 'c_str = stream.str();/* * Uso c_str/stream.freeze (falso); ' –

7

Desde una perspectiva personal en más de una ocasión he visto oscuros daños en la memoria que tardaron días o semanas en rastrear y finalmente se redujo al uso de strstream. ¡Tan pronto como fue reemplazado por stringstream las corrupciones desaparecieron y no hice más preguntas! Eso fue suficiente para mi.

Cuestiones relacionadas