 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michel Michaud Guest
|
Posted: Thu Jul 10, 2003 7:19 pm Post subject: Re: Bug dans strstream? |
|
|
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
|
Posted: Fri Jul 11, 2003 10:07 pm Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Fri Jul 11, 2003 10:18 pm Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Sat Jul 12, 2003 12:26 am Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Sat Jul 12, 2003 12:31 am Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Sat Jul 12, 2003 8:36 am Post subject: Re: Bug dans strstream? |
|
|
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
|
Posted: Sat Jul 12, 2003 8:43 am Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Sat Jul 12, 2003 8:34 pm Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Sat Jul 12, 2003 8:39 pm Post subject: Re: Bug dans strstream? |
|
|
"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
|
Posted: Sun Jul 13, 2003 12:54 pm Post subject: Re: Bug dans strstream? |
|
|
"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 |
|
 |
|
|
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
|
|