OVH Cloud OVH Cloud

[VC6] ostringstream bug ?

12 réponses
Avatar
amerio
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 ?

10 réponses

1 2
Avatar
Michaël Monerau
amerio wrote:
#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 ?


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 -=>

Avatar
blc
Michaël Monerau wrote:
amerio wrote:

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



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


Avatar
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.


Avatar
Marc Ferry
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é.

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


Avatar
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é.

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 -=>


Avatar
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é.

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


Avatar
Samuel Krempp
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

Avatar
tib.motuelle
Marc Ferry wrote in message news:<bl9689$...
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.

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


Avatar
Marc Ferry
Désolé, j'ai en effet confondu avec un ostrstream.
Mea maxima culpa.
Je ferai mieux la prochaine fois ...
Marc
Avatar
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


1 2