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 

Re: Bug dans strstream?

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





PostPosted: Thu Jul 10, 2003 7:19 pm    Post subject: Re: Bug dans strstream? Reply with quote



Dans news:3f0db395$0$29627$626a54ce (AT) news (DOT) free.fr,
metalazz0 <metalazz0 (AT) yahoo (DOT) fr> a écrit :
Quote:
salut!
voila mon code

int main(....)
{
strstream tmp;

Essaie avec ostringstream...

Quote:
tmp << "nom" << " prenom" << numero;

Avec strstream il faut un ends non ?

Quote:
string res = tmp.str();
cout << res << endl;
}

pourtant tres simple comme code, ca ne m'affiche pas la chaine
formatee souhaitee!

Ca m'affichera:

"nom prenom 5²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²"

Pourquoi ca?

Manque le ends...

--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Back to top
Bertrand Motuelle
Guest





PostPosted: Fri Jul 11, 2003 10:07 pm    Post subject: Re: Bug dans strstream? Reply with quote



"Michel Michaud" <mm (AT) gdzid (DOT) com> schrieb im Newsbeitrag
news:l%iPa.8935$ru2.882745 (AT) news20 (DOT) bellglobal.com...
Quote:
Dans news:3f0db395$0$29627$626a54ce (AT) news (DOT) free.fr,
metalazz0 <metalazz0 (AT) yahoo (DOT) fr> a écrit :
int main(....)
{
strstream tmp;

Essaie avec ostringstream...

tmp << "nom" << " prenom" << numero;

Avec strstream il faut un ends non ?
Effectivement.


Quote:

string res = tmp.str();
cout << res << endl;
}

pourtant tres simple comme code, ca ne m'affiche pas la chaine
formatee souhaitee!

Ca m'affichera:

"nom prenom 5²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²"

Pourquoi ca?

Manque le ends...
Le rajouter règlera le pb de la sortie.


Reste à règler celui de la fuite mémoire consécutive à l'appel de str() qui
freeze le stream.
Le plus simple: comme l'a dit Michel, changer strstream en stringstream
(#include Plus lourd: ajouter tmp.rdbuf()->freeze(0); après l'appel à str() ou
encapsuler le tout dans une fonction qui cache cette horreur (et tant qu'à
faire garantie l'exception safety).

Bertrand



Back to top
Alain Naigeon
Guest





PostPosted: Fri Jul 11, 2003 10:18 pm    Post subject: Re: Bug dans strstream? Reply with quote



"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> a écrit dans le message news:
bencet$8dr$07$1 (AT) news (DOT) t-online.com...

Quote:
Reste à règler celui de la fuite mémoire consécutive à l'appel de str()
qui
freeze le stream.

Je ne comprends pas : il me semblait avoir lu qu'après ce freeze,
la propriété de cette zone mémoire passait à l'utilisateur - ce qui
est logique. Donc il peut *et doit*, AMHA, faire un delete sur le
pointeur reçu quand il ne sert plus..!?

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France



Back to top
drkm
Guest





PostPosted: Sat Jul 12, 2003 12:26 am    Post subject: Re: Bug dans strstream? Reply with quote

"Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:

Quote:
"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> a écrit dans le
message news: bencet$8dr$07$1 (AT) news (DOT) t-online.com...

Reste à règler celui de la fuite mémoire consécutive à l'appel de
str() qui freeze le stream.

Je ne comprends pas : il me semblait avoir lu qu'après ce freeze, la
propriété de cette zone mémoire passait à l'utilisateur - ce qui est
logique. Donc il peut *et doit*, AMHA, faire un delete sur le
pointeur reçu quand il ne sert plus..!?

Soit on se charge de libérer la chaîne lorsqu'elle est « frozen »,
soit on la « défrise » [1] avant la destruction du `strstreambuf´.

[1] C'est bien la première fois que `strstreambuf::freeze()´
m'arrache un sourire.

--drkm

Back to top
drkm
Guest





PostPosted: Sat Jul 12, 2003 12:31 am    Post subject: Re: Bug dans strstream? Reply with quote

"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> writes:

Quote:
tmp.rdbuf()->freeze(0);

tmp.rdbuf()->freeze( false ) ;

J'avoue avoir vérifié s'il existait `std::strstreambuf::freeze(int)´.

Une autre solution serait tout simplement de se charger de libérer
soi-même la chaîne. Je préfère néanmoins la solution que tu donnes ;
cela évite, lors de modifications, de réutiliser plus loin le flux
alors que la chaîne a été libérée.

--drkm

Back to top
James Kanze
Guest





PostPosted: Sat Jul 12, 2003 8:36 am    Post subject: Re: Bug dans strstream? Reply with quote

drkm <darkman_spam (AT) yahoo (DOT) fr> writes:

Quote:
"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> writes:

tmp.rdbuf()->freeze(0);

tmp.rdbuf()->freeze( false ) ;

J'avoue avoir vérifié s'il existait `std::strstreambuf::freeze(int)´.

Une autre solution serait tout simplement de se charger de
libérer soi-même la chaîne. Je préfère
néanmoins la solution que tu donnes ; cela évite, lors de
modifications, de réutiliser plus loin le flux alors que la
chaîne a été libérée.

Dans les iostream classiques, c'était bien int. Normal, vue que
bool n'existait pas encore à l'époque. Dans les iostream
standard, évidemment, on utilise stringstream, et le problème ne
se présente pas.

--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France Tel. +33 1 41 89 80 93

Back to top
James Kanze
Guest





PostPosted: Sat Jul 12, 2003 8:43 am    Post subject: Re: Bug dans strstream? Reply with quote

"Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:

Quote:
"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> a écrit dans le
message news: bencet$8dr$07$1 (AT) news (DOT) t-online.com...

Reste à règler celui de la fuite mémoire consécutive
à l'appel de str() qui freeze le stream.

Je ne comprends pas : il me semblait avoir lu qu'après ce
freeze, la propriété de cette zone mémoire passait à
l'utilisateur - ce qui est logique. Donc il peut *et doit*, AMHA,
faire un delete sur le pointeur reçu quand il ne sert plus..!?

C'est aussi une possibilité. Personellement, j'ai toujours
préférer rendre la propriété à strstream une fois que
j'avais fini avec le buffer, au moyen de freeze(0). Mais c'est une
question de goût.

Note bien que dans les deux cas, il faut prendre des précautions
vis-à-vis des exceptions (chose que je ne fais pas encore dans le
code sur ma site). On écrirait donc :

class StrstreamConverter
{
public:
StrstreamConverter( ostrstream& source )
: mySource( source )
{
mySource << ends ;
}
~StrstreamConverter()
{
mySource.rdbuf()->freeze( 0 ) ;
}
operator std::string() const
{
return std::string( mySource.str() ) ;
}
private:
ostrstream& mySource ;
} ;

Note bien l'avantage de l'utilisation de freeze ici. On peut le faire,
qu'on a appelé str ou non.

--
James Kanze mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France Tel. +33 1 41 89 80 93

Back to top
Alain Naigeon
Guest





PostPosted: Sat Jul 12, 2003 8:34 pm    Post subject: Re: Bug dans strstream? Reply with quote

"drkm" <darkman_spam (AT) yahoo (DOT) fr> a écrit dans le message news:
[email]wkptkgmvpm.fsf (AT) yahoo (DOT) fr[/email]...
Quote:
"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> writes:

tmp.rdbuf()->freeze(0);

tmp.rdbuf()->freeze( false ) ;

J'avoue avoir vérifié s'il existait `std::strstreambuf::freeze(int)´.

Une autre solution serait tout simplement de se charger de libérer
soi-même la chaîne. Je préfère néanmoins la solution que tu donnes ;
cela évite, lors de modifications, de réutiliser plus loin le flux
alors que la chaîne a été libérée.

Cela m'inspire une question tellement basique que je m'étonne
d'avoir tardé à me la poser : dans une classe de pointeur intelligent,
on peut prévoir que sa destruction le mette à 0 pour éviter la bévue
que tu signales (puisque delete 0 est garanti inoffensif).
Alors pourquoi, oui, pourquoi le "delete pt" de base du langage ne
remet pas pt à zéro ?? Pourquoi ne pas spécifier cela dans la norme ?
De la sorte on aurait :
delete pt ; // met pt à 0 après le delete tel que l'actuel
delete pt ; // no problem here puisque équivalent à delete 0 !!

C'est trop naïf, quelque chose m'échappe ??

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France



Back to top
Alain Naigeon
Guest





PostPosted: Sat Jul 12, 2003 8:39 pm    Post subject: Re: Bug dans strstream? Reply with quote

"James Kanze" <kanze (AT) alex (DOT) gabi-soft.fr> a écrit dans le message news:
[email]86isq8dtju.fsf (AT) alex (DOT) gabi-soft.fr[/email]...
Quote:
"Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:

|> "Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> a écrit dans le
|> message news: bencet$8dr$07$1 (AT) news (DOT) t-online.com...

|> > Reste à règler celui de la fuite mémoire consécutive
|> > à l'appel de str() qui freeze le stream.

|> Je ne comprends pas : il me semblait avoir lu qu'après ce
|> freeze, la propriété de cette zone mémoire passait à
|> l'utilisateur - ce qui est logique. Donc il peut *et doit*, AMHA,
|> faire un delete sur le pointeur reçu quand il ne sert plus..!?

C'est aussi une possibilité. Personellement, j'ai toujours
préférer rendre la propriété à strstream une fois que
j'avais fini avec le buffer, au moyen de freeze(0). Mais c'est une
question de goût.

Là je suis obligé de faire un aveu douloureux, c'est que je n'avais
jamais remarqué cette possibilité de rendre à la classe la propriété
du buffer à l'aide de freeze ; !!
Remarque, si c'est pour détruire le strstream juste après, cela revient
au même de faire le delete soi-même, et c'est effectivement une
affaire de goût. Jusqu'ici je n'avais pas le choix par manque
d'information...

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - [email]anaigeon (AT) free (DOT) fr[/email] - Strasbourg, France



Back to top
Jean-Marc Bourguet
Guest





PostPosted: Sun Jul 13, 2003 12:54 pm    Post subject: Re: Bug dans strstream? Reply with quote

"Alain Naigeon" <anaigeon (AT) free (DOT) fr> writes:

Quote:
"drkm" <darkman_spam (AT) yahoo (DOT) fr> a écrit dans le message news:
[email]wkptkgmvpm.fsf (AT) yahoo (DOT) fr[/email]...
"Bertrand Motuelle" <tib.motuelle (AT) laposte (DOT) net> writes:

tmp.rdbuf()->freeze(0);

tmp.rdbuf()->freeze( false ) ;

J'avoue avoir vérifié s'il existait `std::strstreambuf::freeze(int)´.

Une autre solution serait tout simplement de se charger de libérer
soi-même la chaîne. Je préfère néanmoins la solution que tu donnes ;
cela évite, lors de modifications, de réutiliser plus loin le flux
alors que la chaîne a été libérée.

Cela m'inspire une question tellement basique que je m'étonne
d'avoir tardé à me la poser : dans une classe de pointeur intelligent,
on peut prévoir que sa destruction le mette à 0 pour éviter la bévue
que tu signales (puisque delete 0 est garanti inoffensif).

Si un pointeur intelligent fait un delete deux fois, c'est qu'il y a
un problème de conception quelque part et que le pointeur n'est pas si
intelligent.

Quote:
Alors pourquoi, oui, pourquoi le "delete pt" de base du langage ne
remet pas pt à zéro ?? Pourquoi ne pas spécifier cela dans la norme ?
De la sorte on aurait :
delete pt ; // met pt à 0 après le delete tel que l'actuel
delete pt ; // no problem here puisque équivalent à delete 0 !!

C'est trop naïf, quelque chose m'échappe ??

C'est pas si naïf que ça (Unchecked_Deallocation est défini comme ça
en Ada). Mais

pt2=pt1;
delete pt1;
delete pt2;

est plus représentatif du problème (c'est très rarement avec la même
variable qu'on essaie de libérer deux fois) et mettre le pointeur à 0
ne change rien à ces cas.

T* pt1();
T* const pt2;
delete pt1();
delete pt2;
delete this;

seraient donc interdit? Le seul qui me gène vraiment, c'est le
troisième, mais interdire les deux autres casserait à coup sûr du code
existant.

Si tu le veux réellement:

template <typename T>
void libere(T*& pt)
{
delete pt;
pt = 0;
}

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

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.