OVH Cloud OVH Cloud

[VC6] ostringstream bug ?

12 réponses
Avatar
amerio
Bonjour,
Sur VC6+sp5, le code suivant compile parfaitement mais plante à l'exécution en quittant
(assertion _BLOCK_TYPE_IS_VALID)

#include <sstream>
#include <string>
int main(int argc, char* argv[])
{
std::ostringstream os;
os << 4;
os.str("x");
std::cout << "os="<< os.str() << std::endl;
return 0;
}

En remplacant os.str("x") par os.str(""), tout rentre dans l'ordre.
Alors ? mauvais compilo, changer de compilo ?
ou bien mauvais programmeur, changer de programmeur ?

2 réponses

1 2
Avatar
tib.motuelle
Samuel Krempp wrote in message news:<3f78714c$0$27568$...
Euh, c'est un ostringstream, pas un ostrstream.....


même un strstream, faut pas désallouer la 'controlled input sequence', sur
laquelle pointe str(). C'est le strstreambuf qui gère sa mémoire.


Pas exactement.
Si le strstate du strstreambuf est 'frozen', son destructeur ne
libèrera pas la 'controlled input sequence'. Il faut soit libérer la
'controlled input sequence' à la main, soit explicitement le défriser.

std::ostrstream ostr; // strmode = dynamic
ostr << 5 << std::ends;
char* buff = ostr.str(); // str() -> rdbuf.str() -> rdbuf.freeze()
// effect: set frozen in strmode

Dans ce cas, le destructeur du strstreambuf ne libèrera pas son
buffer.
Il faut soit ajouter
delete[] buff;
ou
ostr.rdbuf()->freeze(0);

Bertrand.


Avatar
Samuel Krempp
le Tuesday 30 September 2003 15:19, écrivit :

C'est pour ça en général qu'une fois qu'on a fini avec le pointeur, on
fait un coup de freeze( 0 ), pour déverouiller les buffers et en
répasser la gestion à strstreambuf.


ah oui c'est vrai. désallouer str m'a choqué car personnellement j'ai
simplement pris l'habitude d'enlever le freeze après l'utilisation de
str(). ça revient au même pour la destruction (mais enlever le freeze est
plus général, il permet de continuer d'utiliser le strstream, etc)
même si laisser le freeze et désallouer est correcte, je préfère me fixer
comme règle de toujours enlever le freeze après usage.
Enfin, pour le peu que j'utilise des strstream, ça change pas grand chose.

A ce propos, y-a-t il des projets de rempalcer strstream (qui est
deprecated) ? Même avec stringstream, on peut avoir besoin d'une classe
comme strstream, avec la possibilité de voire une chaîne en tant que stream
et vice versa sans faire de copies.

--
Sam

1 2