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 ?
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 -=>
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 -=>
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 -=>
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...
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...
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
amerio
Samuel Krempp wrote:
le Tuesday 23 September 2003 09:37, é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.
Samuel Krempp wrote:
le Tuesday 23 September 2003 09:37, lecallennec@yahoo.fr é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.
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 ?
amerio wrote:
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;
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é.
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 ?
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 ?
Michaël Monerau
Marc Ferry wrote:
os.str("x"); std::cout << "os="<< os.str() << std::endl; Et une fuite mémoire, une, car os.str() doit être libéré.
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 -=>
Marc Ferry wrote:
os.str("x");
std::cout << "os="<< os.str() << std::endl;
Et une fuite mémoire, une, car os.str() doit être libéré.
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 -=>
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 -=>
amerio
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é.
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
Marc Ferry <mferry.ext@rd.francetelecom.com> wrote in message news:<bl9689$72e3@news.rd.francetelecom.fr>...
amerio wrote:
#include <sstream>
#include <string>
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.
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.
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.
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
Marc Ferry
Désolé, j'ai en effet confondu avec un ostrstream. Mea maxima culpa. Je ferai mieux la prochaine fois ... Marc
Désolé, j'ai en effet confondu avec un ostrstream.
Mea maxima culpa.
Je ferai mieux la prochaine fois ...
Marc
Désolé, j'ai en effet confondu avec un ostrstream. Mea maxima culpa. Je ferai mieux la prochaine fois ... Marc
kanze
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.
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: 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
Samuel Krempp <krempp@crans.truc.en.trop.ens-cachan.fr> wrote in message
news:<3f78714c$0$27568$626a54ce@news.free.fr>...
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@gabi-soft.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
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.
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: 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