IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Class / destructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut Class / destructeur
    bonjour tout le monde,

    ma question est surement bete, mais je n'ai pas trouvé d'exemple ou d'aide sur internet.
    Mon problème est sur le destructeur d'une classe. je ne vois pas trop ce qu'il faut mettre dans le code d'un destructeur.
    delete this;?
    delete de chaque donnée membres ...?
    doit on utiliser un delete? sachant que le delete appel lui aussi le destructeur ...

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    delete sur chaque donnée membre créée avec new.

    Et généralement, si tu ne fais que du C++, rien de plus.
    (Si tu utilisais des fichiers C dans ta classe par exemple, tu pourrais avoir besoin d'un close(), etc.)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    Aucunne de mes donnée menbre n'est créée avec un new, c'est que des int, short char.

    je dois donc rien mettre dans le destructeur?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    On dirait bien.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Par défaut
    et comme je créé une fonction avec auccun code a l'intérieur a t'elle réellement besoin d'exister?

  6. #6
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    Non, tu n'es pas obligé de la créer, elle l'est automatiquement.

    Maintenant, une bonne habitude, c'est de la déclarer quand même (tout en la laissant vide). Cela permet au moins de savoir que tu y as réfléchi...

  7. #7
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Juste un truc : vérifies que tu as bien fermé toutes tes sources de données : fichiers, connexions à des BDD, ...

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Il y a quelques cas particuliers où expliciter le destructeur est nécessaire
    - pour les classes dans des hiérarchies polymorphes, le destructeur doit être virtuel et public pour permettre la destruction polymorphique
    - pour les classes de base ("base" comme dans héritage) de hiérarchies non polymorphes qui apportent du code. Il peut être bon d'avoir le destructeur explicité non virtuel mais protégé
    - pour les classes qui ont des membres dont le destructeur inliné fait un appel explicite à une fonction qui peut se comporter différemment d'une unité de traduction (ou d'une bibliothèque) à l'autre -- typiquement pour quand new/delete sont supplantés dans une UT ou dans une lib. Typiquement, si ta classe contient un auto_ptr<>, il vaut mieux lui adjoindre un destructeur non inliné. En fait il faudrait procéder encore autrement en attachant la fonction de libération au pointeur intelligent au moment de la construction.


    Je me doute bien que tout ceci te passe largement au dessus de la tête.
    Retiens que si tu gères manuellement une ressource dont tu es responsable, alors il faut toujours la libérer à ta mort => dans ton destructeur.
    Une des règles (pour avoir un code simple, juste et maintenable) est de ne jamais être directement responsable de plus d'une seule ressource. Cf l'entrée sur le RAII dans la FAQ.

    PS: le destructeur d'un objet est appelé qunad tu appelles delete sur un pointeur vers ton objet, où quand ton objet était sur la pile et que l'on sort de la portée dans laquelle il vivait. => n'appelle jamais delete sur this dans un destructeur. A moins de vouloir partir en boucle qui aurait pu être infinie si elle ne faisait pas planter le programme immédiatement.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre éclairé
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Par défaut
    Dans le même genre, j'ai il y a peu qu'il était inutile, voir nuisible d'implémenter et de déclarer explicitement le destructeur d'une classe si celui-ci est destiné a être "vide" , et que dans ce cas, le compilateur ferai un meilleur travail a notre place . Je ne vois pas trop comment ni pourquoi, alors info ou intox ?

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Inutile ? sûrement. Nuisible ? Le seul code où je suis à peu près sur de ne pas faire d'erreur, c'est le code que je n'écris pas. Donc oui. C'est du travail bête et méchant, du travail de compilateur, pas de développeur.

    De plus, en général, quand je vois un destructeur, je me pose automaitquement des questions sur le contructeur par recopie et l'opératuer d'affectation. Si le destructeur est "vide", c'est inutile, mais j'ai peut-être perdu un peu de temps à la lecture.

    Enfin, le destructeur par défaut est déclaré inline, le tiens, ça dépend. Est-ce qu'il y a un impact, j'en doute très fortement. Je n'ai jamais effectué de mesure.

    Donc, en gros, rien de bien grave, mais je préfère ne rien mettre.

    Attention : Je ne parle bien évidemment pas ici du fait de déclarer un destructeur virtuel pour une classe de base d'une hiérarchie polymorphe, qui est très important, qu'il soit vide ou non.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/04/2007, 13h34
  2. Réponses: 3
    Dernier message: 30/03/2007, 10h38
  3. Destructeur de classe - remise à NULL
    Par buzzkaido dans le forum C++
    Réponses: 33
    Dernier message: 23/03/2007, 15h59
  4. Réponses: 2
    Dernier message: 30/01/2007, 16h55
  5. Conseil du compilo sur un destructeur d'une classe
    Par okparanoid dans le forum Langage
    Réponses: 2
    Dernier message: 20/07/2005, 20h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo