C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

[VC6] ostringstream bug ?

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
amerio
Guest





PostPosted: Sun Sep 21, 2003 6:18 pm    Post subject: [VC6] ostringstream bug ? Reply with quote



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 ?


Back to top
Michaël Monerau
Guest





PostPosted: Sun Sep 21, 2003 7:05 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote



amerio wrote:
Quote:
#include <sstream
#include 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 ?

Ton exemple marche bien sur mon VC++ 7.1... Sûrement un problème avec VC6.
Décidément, il vieillit mal celui-là :(

Donc, changer de compilo à première vue Smile
--
<=- Michaël "Cortex" Monerau -=>



Back to top
blc
Guest





PostPosted: Tue Sep 23, 2003 7:37 am    Post subject: Re: [VC6] ostringstream bug ? Reply with quote



Michaël Monerau wrote:
Quote:
amerio wrote:

#include #include 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 ?


Ton exemple marche bien sur mon VC++ 7.1... Sûrement un problème avec VC6.
Décidément, il vieillit mal celui-là :(

Donc, changer de compilo à première vue Smile

Chez moi ca semble fonctionner correctement aussi et sur VC6 en plus...

Benoit


Back to top
amerio
Guest





PostPosted: Tue Sep 23, 2003 9:57 am    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Samuel Krempp wrote:
Quote:
le Tuesday 23 September 2003 09:37, [email]lecallennec (AT) yahoo (DOT) fr[/email] écrivit :

Chez moi ca semble fonctionner correctement aussi et sur VC6 en plus...

un des correctifs téléchargeables chez dinkumware fixe peut être ce
problème.

Heu, je dois etre fatigué, mais je ne trouve pas de lien chez eux pour un download.
Tu aurais un lien direct ? Merci.



Back to top
Marc Ferry
Guest





PostPosted: Mon Sep 29, 2003 11:49 am    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

amerio wrote:
Quote:
Bonjour,
Sur VC6+sp5, le code suivant compile parfaitement mais plante à l'exécution en quittant
(assertion _BLOCK_TYPE_IS_VALID)

#include #include int main(int argc, char* argv[])
{
std::ostringstream os;
os << 4;
J'aurai plutôt mis

oss << 4 << std::ends;
où std::ends correspond à ''
Quote:
os.str("x");
std::cout << "os="<< os.str() << std::endl;
Et une fuite mémoire, une, car os.str() doit être libéré.

Je suggère
char* str = os.str();
std::cout << "os=" << str << std::endl;
delete str;
str = 0;
Quote:
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 ?


Back to top
Michaël Monerau
Guest





PostPosted: Mon Sep 29, 2003 2:24 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Marc Ferry wrote:
Quote:
os.str("x");
std::cout << "os="<< os.str() << std::endl;
Et une fuite mémoire, une, car os.str() doit être libéré.
Je suggère
char* str = os.str();
std::cout << "os=" << str << std::endl;
delete str;
str = 0;
return 0;

Quoi ????

Tu fais une erreur là ! str() renvoie le std::string correspondant au
contenu du ostringstream... Donc c'est le std::string qui s'occupe de la
désallocation. De plus, on ne peut pas stocker un std::string dans un char*
!

Et de toute façon, il a appelé `oss.str ("x")' qui a pour effet de changer
le contenu du stream, qui est différent de ton `oss.str()' qui sert juste à
savoir ce qu'il y a actuellement dans le ostringstream. Et ça renvoie un
std::string... pas un char*.

Tu as du mal lire Wink
--
<=- Michaël "Cortex" Monerau -=>



Back to top
amerio
Guest





PostPosted: Mon Sep 29, 2003 4:28 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Quote:
std::ostringstream os;
os << 4;
J'aurai plutôt mis
oss << 4 << std::ends;
où std::ends correspond à ''
os.str("x");
std::cout << "os="<< os.str() << std::endl;
Et une fuite mémoire, une, car os.str() doit être libéré.
Je suggère
char* str = os.str();
std::cout << "os=" << str << std::endl;
delete str;
str = 0;
return 0;

Euh, c'est un ostringstream, pas un ostrstream.....



Back to top
Samuel Krempp
Guest





PostPosted: Mon Sep 29, 2003 5:52 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Quote:
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.

--
Sam

Back to top
Bertrand Motuelle
Guest





PostPosted: Tue Sep 30, 2003 8:17 am    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Marc Ferry <mferry.ext (AT) rd (DOT) francetelecom.com> wrote

Quote:
amerio wrote:
#include #include int main(int argc, char* argv[])
{
std::ostringstream os;
os << 4;
J'aurai plutôt mis
oss << 4 << std::ends;
où std::ends correspond à ''

Non std::ends est inutile est inutile dans ce cas: Amerio a utilisé
ostringstream, pas ostrstream et le code qu'il a posté est
parfaitement valide.

Quote:
os.str("x");
std::cout << "os="<< os.str() << std::endl;
Et une fuite mémoire, une, car os.str() doit être libéré.

Non plus. La fonction str() de ostringstream retourne un std::string
par valeur.
Pas de fuite mémoire donc.

Quote:
Je suggère
char* str = os.str();
std::cout << "os=" << str << std::endl;
delete str;
str = 0;

Comme dit précedemment ce code n'est pas adapté aux ostringstream.
Et même avec ostrstream, tu obtiens un comportement indéfini (un), car
delete[] (pas delete) doit être appelé pour libérer la chaîne de
caractères.
Et même en corrigeant celà, ce code reste fragile en présence
d'exceptions.

Bertrand

Back to top
Marc Ferry
Guest





PostPosted: Tue Sep 30, 2003 12:42 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Désolé, j'ai en effet confondu avec un ostrstream.
Mea maxima culpa.
Je ferai mieux la prochaine fois ...
Marc

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Tue Sep 30, 2003 1:19 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Samuel Krempp <krempp (AT) crans (DOT) truc.en.trop.ens-cachan.fr> wrote


Quote:
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.

Oui et non. Quand tu fais strstreambuf::str, tu fais aussi effectivement
freeze(1), ce qui verouille les buffers du côté strstreambuf, et qui en
passe la gestion à toi. Alors, c'est à toi de savoir s'il s'agit d'un
buffer dynamique ou non, et éventuellement à faire le delete.

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.

--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

Back to top
Bertrand Motuelle
Guest





PostPosted: Tue Sep 30, 2003 1:27 pm    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

Samuel Krempp <krempp (AT) crans (DOT) truc.en.trop.ens-cachan.fr> wrote

Quote:
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.

Back to top
Samuel Krempp
Guest





PostPosted: Wed Oct 01, 2003 8:57 am    Post subject: Re: [VC6] ostringstream bug ? Reply with quote

le Tuesday 30 September 2003 15:19, [email]kanze (AT) gabi-soft (DOT) fr[/email] écrivit :

Quote:
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

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.