 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
amerio Guest
|
Posted: Sun Sep 21, 2003 6:18 pm Post subject: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Sun Sep 21, 2003 7:05 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
blc Guest
|
Posted: Tue Sep 23, 2003 7:37 am Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Chez moi ca semble fonctionner correctement aussi et sur VC6 en plus...
Benoit
|
|
| Back to top |
|
 |
amerio Guest
|
Posted: Tue Sep 23, 2003 9:57 am Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Mon Sep 29, 2003 11:49 am Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Mon Sep 29, 2003 2:24 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
--
<=- Michaël "Cortex" Monerau -=>
|
|
| Back to top |
|
 |
amerio Guest
|
Posted: Mon Sep 29, 2003 4:28 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
| 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
|
Posted: Mon Sep 29, 2003 5:52 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
| 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
|
Posted: Tue Sep 30, 2003 8:17 am Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Tue Sep 30, 2003 12:42 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Tue Sep 30, 2003 1:19 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Tue Sep 30, 2003 1:27 pm Post subject: Re: [VC6] ostringstream bug ? |
|
|
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
|
Posted: Wed Oct 01, 2003 8:57 am Post subject: Re: [VC6] ostringstream bug ? |
|
|
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 |
|
 |
|
|
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
|
|