OVH Cloud OVH Cloud

[debutant] Problème (de destructeur ? )

6 réponses
Avatar
AG
Bonjour, après avoir essayé de réduire le code de mon programme au plus
petit exemple compilable, le voici :

#include <fstream>
#include <vector>
#include <functional>
#include <algorithm>

class A
{
private :
int seed;
std::ofstream ofile;
public:
int operator() (void) {return seed;}
void Save(void) { ofile.open("coucou.txt");ofile.close();}
};

int main(void)
{
A a=A();
a.Save();
std::vector<int> b(10000);
std::generate(b.begin(),b.end(),a);
return 0;
}

ça plante juste après le return 0, dans la fonction _Tidy de la class
basic_string (fichier XSTRING)

Si quelqu'un savait m'expliquer ce qu'il ne va pas, je l'en remercierais
d'avance.

Alexandre.

6 réponses

Avatar
Michel Michaud
Dans le message 4220be2e$0$29681$,
class A
{
private :
int seed;
std::ofstream ofile;
public:
int operator() (void) {return seed;}
void Save(void) { ofile.open("coucou.txt");ofile.close();}
};

int main(void)
{
A a=A();


As-tu essayé avec simplement

A a;

Ça devrait suffire. Tu faisais une « copie » de ton ofile, ce qui
devrait être impossible de toute façon... (mais certains
compilateurs le permettaient, avec les risques encourus).

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
AG
Michel Michaud wrote:

Dans le message 4220be2e$0$29681$,

class A
{
private :
int seed;
std::ofstream ofile;
public:
int operator() (void) {return seed;}
void Save(void) { ofile.open("coucou.txt");ofile.close();}
};

int main(void)
{
A a=A();



As-tu essayé avec simplement

A a;

Ça devrait suffire. Tu faisais une « copie » de ton ofile, ce qui
devrait être impossible de toute façon... (mais certains
compilateurs le permettaient, avec les risques encourus).

oui, ça ne marche pas non plus.



Avatar
Michel Michaud
Dans le message 4220c8c6$0$29693$,
Michel Michaud wrote:
Dans le message 4220be2e$0$29681$,
class A
{
private :
int seed;
std::ofstream ofile;
public:
int operator() (void) {return seed;}
void Save(void) { ofile.open("coucou.txt");ofile.close();}
};

int main(void)
{
A a=A();



As-tu essayé avec simplement

A a;

Ça devrait suffire. Tu faisais une « copie » de ton ofile, ce qui
devrait être impossible de toute façon... (mais certains
compilateurs le permettaient, avec les risques encourus).

oui, ça ne marche pas non plus.



Alors on ne peut pas t'aider vraiment. Ton code est incorrect,
comme je l'ai dit, on ne peut pas copier les ofstream, donc
le code que tu montres ne compile pas, avec mes deux compilateurs
courants... Pour que ça fonctionne, il faudrait que tu fasses les
choses autrement et ça règlerait peut-être ton autre problème...
(Tu pourrais garder un pointeur sur un ofstream par exemple, et
ajuster le reste de ta classe en conséquence, ou mettre le ofstream
en variable locale dans ta fonction, etc.)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
AG
Alors on ne peut pas t'aider vraiment. Ton code est incorrect,
comme je l'ai dit, on ne peut pas copier les ofstream,
N'y a-t-il pas un moyen de faire sans le copier. Comme tu indiquais, ne

faire que :

A a;

au lieu de :

A a=A();

Evite de faire une copie non ?

donc
le code que tu montres ne compile pas, avec mes deux compilateurs
courants...
Pourtant moi il compile avec VC++ 6.0. c'est courant comme compilo

pourtant non ? Y a-t-il des réglages particuliers à faire ?


Pour que ça fonctionne, il faudrait que tu fasses les
ou mettre le ofstream
en variable locale dans ta fonction, etc.)


je vais essayer cela.

Merci.

Avatar
Michel Michaud
Dans le message 4220d74c$0$29669$,
Alors on ne peut pas t'aider vraiment. Ton code est incorrect,
comme je l'ai dit, on ne peut pas copier les ofstream,
N'y a-t-il pas un moyen de faire sans le copier. Comme tu

indiquais, ne faire que :

A a;

au lieu de :

A a=A();

Evite de faire une copie non ?


Oui, mais il y a une autre copie quand tu passes ton paramètre
à generate.

donc
le code que tu montres ne compile pas, avec mes deux compilateurs
courants...
Pourtant moi il compile avec VC++ 6.0. c'est courant comme compilo

pourtant non ? Y a-t-il des réglages particuliers à faire ?


C'est le compilateur auquel je pensais que je disais qu'il le permettait,
mais ça reste incorrect (ça ne fonctionne pas vraiment comme tu peux le
voir). En fait, je ne sais pas si d'autres compilateurs l'auront jamais
accepté !

Et ce n'est pas vraiment un compilateur « courant » (même s'il reste
assez utilisé), il date de 1998 ! Tu savais qu'on est en 2005 ? :-)
(il y a au moins trois versions plus récentes, mais surtout beaucoup
plus conformes au standard)

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/


Avatar
AG
Michel Michaud wrote:

Dans le message 4220d74c$0$29669$,

Alors on ne peut pas t'aider vraiment. Ton code est incorrect,
comme je l'ai dit, on ne peut pas copier les ofstream,


N'y a-t-il pas un moyen de faire sans le copier. Comme tu
indiquais, ne faire que :

A a;

au lieu de :

A a=A();

Evite de faire une copie non ?



Oui, mais il y a une autre copie quand tu passes ton paramètre
à generate.
ok je comprends



donc
le code que tu montres ne compile pas, avec mes deux compilateurs
courants...


Pourtant moi il compile avec VC++ 6.0. c'est courant comme compilo
pourtant non ? Y a-t-il des réglages particuliers à faire ?



C'est le compilateur auquel je pensais que je disais qu'il le permettait,
mais ça reste incorrect (ça ne fonctionne pas vraiment comme tu peux le
voir). En fait, je ne sais pas si d'autres compilateurs l'auront jamais
accepté !
d'accord.



Et ce n'est pas vraiment un compilateur « courant » (même s'il reste
assez utilisé), il date de 1998 ! Tu savais qu'on est en 2005 ? :-)
oui oui, mais bon, c'est les outils que j'ai.


(il y a au moins trois versions plus récentes, mais surtout beaucoup
plus conformes au standard)
j'ai redisigné mon truc en mettant le ofstream dans ma fonction, ça

marche trés bien comme ça.

Merci.