C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Destructeur implicite défini explicitement

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Michel Michaud
Guest





PostPosted: Thu Apr 22, 2004 5:35 pm    Post subject: Destructeur implicite défini explicitement Reply with quote



Le code suivant compile sans problème avec VC 7.1 :

#include <string>
#include <iostream>

class C
{
std::string s; // Avec rien (ou int) ça ne compile pas

// Aucun destructeur déclaré...
};

C::~C()
{
std::cout << "Hum";
}

int main()
{
C c;
} // Affiche bien Hum, il voit donc le destructeur

C'est clairement un bogue, mais quelqu'un a-t-il une idée
de la logique qui mène à ce bogue ? Surtout qu'en mettant
un int au lieu de std::string, le compilateur se plaint
correctement... J'aimerais bien comprendre s'il n'y a pas
d'autres possibilités de bogues qui seraient reliées et savoir
si d'autres compilateurs tombent dans le panneau !

--
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
Mathieu Peyréga
Guest





PostPosted: Thu Apr 22, 2004 6:00 pm    Post subject: Re: Destructeur implicite défini explicitement Reply with quote



Que se passe-t-il si tu fait :

int main()
{
std::cout << "begin of scope" << std::endl;
{
C c;
}
std::cout << "end of scope" << std::endl;

return 0;
}


Michel Michaud a écrit:
Quote:
Le code suivant compile sans problème avec VC 7.1 :

#include #include
class C
{
std::string s; // Avec rien (ou int) ça ne compile pas

// Aucun destructeur déclaré...
};

C::~C()
{
std::cout << "Hum";
}

int main()
{
C c;
} // Affiche bien Hum, il voit donc le destructeur

C'est clairement un bogue, mais quelqu'un a-t-il une idée
de la logique qui mène à ce bogue ? Surtout qu'en mettant
un int au lieu de std::string, le compilateur se plaint
correctement... J'aimerais bien comprendre s'il n'y a pas
d'autres possibilités de bogues qui seraient reliées et savoir
si d'autres compilateurs tombent dans le panneau !



Back to top
Michel Michaud
Guest





PostPosted: Thu Apr 22, 2004 6:27 pm    Post subject: Re: Destructeur implicite défini explicitement Reply with quote



[Message reconstruit dans le bon ordre...]

Dans news:40880841.1050405 (AT) netcourrier (DOT) nospam.com, Mathieu
Peyréga <peyrega (AT) netcourrier (DOT) nospam.com> a écrit :
Quote:
Michel Michaud a écrit:
Le code suivant compile sans problème avec VC 7.1 :

#include #include
class C
{
std::string s; // Avec rien (ou int) ça ne compile pas

// Aucun destructeur déclaré...
};

C::~C()
{
std::cout << "Hum";
}

int main()
{
C c;
} // Affiche bien Hum, il voit donc le destructeur

Que se passe-t-il si tu fait :

int main()
{
std::cout << "begin of scope" << std::endl;
{
C c;
}
std::cout << "end of scope" << std::endl;

return 0;
}

Ça fait bien ce que c'est supposé faire. Il voit bien le
destructeur, simplement il l'accepte même si on ne l'a
pas déclaré explicitement.

--
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
Jean-Marc Bourguet
Guest





PostPosted: Fri Apr 23, 2004 6:22 am    Post subject: Re: Destructeur implicite défini explicitement Reply with quote

"Michel Michaud" <mm (AT) gdzid (DOT) com> writes:

Quote:
Le code suivant compile sans problème avec VC 7.1 :

#include #include
class C
{
std::string s; // Avec rien (ou int) ça ne compile pas

// Aucun destructeur déclaré...
};

C::~C()
{
std::cout << "Hum";
}

int main()
{
C c;
} // Affiche bien Hum, il voit donc le destructeur

C'est clairement un bogue, mais quelqu'un a-t-il une idée de la
logique qui mène à ce bogue ? Surtout qu'en mettant un int au lieu
de std::string, le compilateur se plaint correctement... J'aimerais
bien comprendre s'il n'y a pas d'autres possibilités de bogues qui
seraient reliées et savoir si d'autres compilateurs tombent dans le
panneau !

Donner la logique d'un bogue dans un compilateur dont on n'a jamais vu
les sources, ni meme jamais utilise...

Il y a trois cas:
- destructeur implicite sans rien a faire
- destructeur implicite avec quelque chose a faire
- destructeur declare

Apparemment VC 7.1 confonds les deux derniers. Que se passe-t'il si
tu declares le destructeur mais ne le definit pas?

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
Alexis Nikichine
Guest





PostPosted: Fri Apr 23, 2004 7:18 am    Post subject: Re: Destructeur implicite défini explicitement Reply with quote

"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote

Quote:
Le code suivant compile sans problème avec VC 7.1 :

#include #include
class C
{
std::string s; // Avec rien (ou int) ça ne compile pas

// Aucun destructeur déclaré...
};

C::~C()
{
std::cout << "Hum";
}

int main()
{
C c;
} // Affiche bien Hum, il voit donc le destructeur

C'est clairement un bogue, mais quelqu'un a-t-il une idée
de la logique qui mène à ce bogue ? Surtout qu'en mettant
un int au lieu de std::string, le compilateur se plaint
correctement... J'aimerais bien comprendre s'il n'y a pas
d'autres possibilités de bogues qui seraient reliées et savoir
si d'autres compilateurs tombent dans le panneau !

Sans être auteur de compilateur, puis-je imaginer le scénario suivant ?

- le compilateur parse la définition de C
- il remarque qu'il y a un objet à destructeur non trivial, contenu
par valeur (std::string), et se dit "damned, je vais devoir génerer un
destructeur non trivial".
- il note donc bien que C a un destructeur non trivial
- puis il tombe sur la définition de C::~C, et il ne bronche pas car
après tout, il sait que C à un destructeur non trivial.

Pour éprouver mes allégations, est-ce que ça marche de la même façon
(euh, est-ce que ca bugge pareil, quoi Smile avec d'autres objets que
std::string, ayant aussi des destructeurs ?

Le panneau que j'imagine est un cas ou le compilateur aurait mélangé les
"symboles" du destructeur des membres par valeur de la classe,
implicitement généré, et le destructeur utilisateur, explicitement
spécifié. Le premier doit-être appelé après le second en principe.

Ici, vu la salade que j'imagine, peux-tu vérifier si le std::string est
effectivement détruit (et sa mémoire pas leakée), ie que ton destructeur
n'a pas complètement remplacé le destructeur implicite ?


Alexis

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Apr 23, 2004 9:10 am    Post subject: Re: Destructeur implicite défini explicitement Reply with quote

"Michel Michaud" <mm (AT) gdzid (DOT) com> wrote


Quote:
Le code suivant compile sans problème avec VC 7.1 :

#include #include
class C
{
std::string s; // Avec rien (ou int) ça ne compile pas

// Aucun destructeur déclaré...
};

C::~C()
{
std::cout << "Hum";
}

int main()
{
C c;
} // Affiche bien Hum, il voit donc le destructeur

C'est clairement un bogue,

Selon quoi ? Moi, aussi, j'ai toujours crû que ça doit être une erreur
(et je crois que c'en était l'intention), mais je ne trouve pas où la
norme le dit. Il y a un destructeur déclaré. Implicitement, mais déclaré
quand même. Tu l'implémentes. Quoi de plus naturel ?

J'ai sans doute raté quelque chose (je ne passe plus des heures à
étudier la norme), mais la seule chose que je vois qui le rendrait
illégal, c'est §12.4/5 : « An implicitly-declared destructor is
implicitly defined when it is used to destroy an objecct of its class
type. » Du coup, il y en a deux définitions, différentes, qui est une
violation de la ODR. Comportement indéfini, alors.

Je suis assez certain que ce n'était pas l'intention de la norme de
permettre à l'utilisateur de définir un destructeur déclaré
implicitement. Est-ce que quelqu'un d'autre trouve où c'est interdit
dans la norme ?

Quote:
mais quelqu'un a-t-il une idée de la logique qui mène à ce bogue ?

La logique est assez simple. Le destructeur implicit n'est pas trivial.
Internalement, le compilateur distingue probablement entre les classes
qui ont un destructeur non-trivial, et celle dont le destructeur est
trivial ; c'est même probable qu'il utilise la formulation courante qui
dise que la classe n'a pas de destructeur.

Du coup, quand tu cherches à définir le destructeur, le compilateur
régarde si la classe a un destructeur. Elle en a, donc, il accepte la
définition.

Quote:
Surtout qu'en mettant un int au lieu de std::string, le compilateur se
plaint correctement... J'aimerais bien comprendre s'il n'y a pas
d'autres possibilités de bogues qui seraient reliées et savoir si
d'autres compilateurs tombent dans le panneau !

En ce qui concerne d'autres compilateurs, je n'en sais rien. L'erreur
s'explique assez facilement, à mon avis. Elle pourrait éventuellement
concerner d'autres fonctions déclarées implicitement : le constructeur
de copie, le constructeur par défaut, ou l'opérateur d'affectation.

Aussi, le destructeur implicit est déclaré inline. Ça serait
intéressant de voir si le destructeur que tu as écrit ci-dessus est
considéré inline. (Selon le compilateur, il n'apparaît pas comme global
dans la table des symboles de l'objet, ou tu peux le définir dans
plusieurs unités de compilation sans avoir d'erreur lors de l'édition
des liens.)

--
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
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Mathieu Peyréga
Guest





PostPosted: Fri Apr 23, 2004 4:33 pm    Post subject: Re: Destructeur implicite défini explicitement Reply with quote

paragraphe 12 de la norme (enfin la version du doc que j'ai réussi à
récuperer) :

The default constructor (12.1), copy constructor and copy assignment
operator (12.Cool, and destructor (12.4) are special member functions.
(...)
Program shall not define implicitly-declared member functions.

Et donc ce n'est pas standard... (c'est d'ailleur rejeté par gcc 3.3.3,
je n'ai pas encore eu l'occasion de tester la release 3.4.0...

En revanche, la lecture de la norme (enfin le survol que j'en ai fait
aujourd'hui vu que c'est la première fois que j'avais le doc dans les
mains - version de 1998) Je fait un post pour parler de tout ça dans la
soirée

Cordialement,

Mathieu

Back to top
Mathieu Peyréga
Guest





PostPosted: Fri Apr 23, 2004 9:07 pm    Post subject: Re: Destructeur implicite défini explicitement Reply with quote

Quote:
C'est clairement un bogue,

Selon quoi ? Moi, aussi, j'ai toujours crû que ça doit être une erreur
(et je crois que c'en était l'intention), mais je ne trouve pas où la
norme le dit. Il y a un destructeur déclaré. Implicitement, mais déclaré
quand même. Tu l'implémentes. Quoi de plus naturel ?

J'ai l'impression que mon message précédent n'est pas passé...
c'est contraire à la norme (enfin dans le doc que j'ai récupéré qui est une
version qui date de septembre 2003)

Paragraphe 12 : toutes premières lignes :
on y dit que constructeur par défaut, constructeur de copie, operateur
d'assignement et destructeur sont des fonctions membres spéciales.
2 ou 3 lignes plus loins :
Un programme qui ne déclare pas une fonction membre spéciale mais la défini
est "malformé"


Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Mon Apr 26, 2004 7:00 am    Post subject: Re: Destructeur implicite défini explicitement Reply with quote

Mathieu Peyréga <peyrega (AT) no (DOT) spam.netcourrier.com> wrote


Quote:
C'est clairement un bogue,

Selon quoi ? Moi, aussi, j'ai toujours crû que ça doit être une
erreur (et je crois que c'en était l'intention), mais je ne trouve
pas où la norme le dit. Il y a un destructeur déclaré.
Implicitement, mais déclaré quand même. Tu l'implémentes. Quoi de
plus naturel ?

J'ai l'impression que mon message précédent n'est pas passé... c'est
contraire à la norme (enfin dans le doc que j'ai récupéré qui est une
version qui date de septembre 2003)

Paragraphe 12 : toutes premières lignes :
on y dit que constructeur par défaut, constructeur de copie, operateur
d'assignement et destructeur sont des fonctions membres spéciales.
2 ou 3 lignes plus loins :
Un programme qui ne déclare pas une fonction membre spéciale mais la
défini est "malformé"

Tout à fait. J'avais régardé rapidement toutes les sections sur les
destructeurs, mais je n'avais pas régardé le texte global au début du
chapître.

--
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
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.