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 :

Gestion de mémoire - Destructeurs


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Gestion de mémoire - Destructeurs
    Bonjour,

    Je vous sollicite pour que vous éclairez ma lanterne.
    Après lu plusieurs documents sur l'allocation dynamique, j'ai compris ceci.

    Si on initialise un "*objet1" avec new, il faut le détruire avec delete.
    Pour un "objet1", ce n'est pas la peine il est automatiquement détruit lorsqu'il voit }.

    Maintenant imaginons qu'on ait une "classe" dont un des membres est "*objet1" et qu'il est initialisé avec new quelque part dans la classe.

    Si je déclare un "objet2" de type "classe", lorsque cet "objet2" sera détruit, son membre "*objet1" le sera-t-il aussi automatiquement ????

    J'espère être assez claire dans ma question, merci par avance.

  2. #2
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Si *objet1 est initialisé avec new quelque part dans la classe, comme tu dis, alors c'est probablement dans le destructeur de objet2 que tu devras faire un delete objet1.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    D'accord, donc c'est à moi de créer le destructeur de ma classe et de lui dire de deleter mon membre "*objet1". Je pensais que la destruction se faisait toute seule.

    (N'empêche, créer un destructeur ... )

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Une bonne pratique pour avoir ton pointeur détruit automatiquement mais surtout pour éviter tous les problèmes liés aux pointeurs nus à l'intérieur d'une classe, il est préférable d'utiliser des pointeurs intelligents.
    F.A.Q. : Comment gérer proprement des allocations / désallocations de ressources ? Le RAII !
    Tutoriel : Présentation des pointeurs intelligents en C++, par Loïc Joly.

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour,
    Une bonne pratique pour avoir ton pointeur détruit automatiquement mais surtout pour éviter tous les problèmes liés aux pointeurs nus à l'intérieur d'une classe, il est préférable d'utiliser des pointeurs intelligents.
    F.A.Q. : Comment gérer proprement des allocations / désallocations de ressources ? Le RAII !
    Tutoriel : Présentation des pointeurs intelligents en C++, par Loïc Joly.
    Et comme les pointeurs intelligents sont généralement des classes template, ils sont tous sujet au même problème que std::auto_ptr<> si le destructeur de la classe possesseur est implicite ou inline. Voir mon article sur le sujet.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Dans mes souvenirs, ceux de boost éliminent ce problème.
    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...

  7. #7
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Le destructeur de shared_ptr n'a pas besoin que le type en paramètre soit un type complet (lire par exemple http://www.boost.org/doc/libs/1_41_0...tm#Handle/Body ). Et tout cas boost::shared_ptr, mais il y a des chances que ce soit le cas aussi pour std::shared_ptr (bien que je n'ai rien lu à ce sujet dans la norme).

    Pour unique_ptr, un type complet est requis, mais un diagnostique est lui aussi requis si la condition n'est pas respectée, donc pas de risque d'erreur.
    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.

  8. #8
    Membre averti Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Points : 323
    Points
    323
    Par défaut
    Je confirme, on n'as pas ce probleme avec les shared_ptr.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    //Code extrait de boost/checked_delete.hpp
    template<class T> inline void checked_delete(T * x)
    {
        // intentionally complex - simplification causes regressions
        typedef char type_must_be_complete[ sizeof(T)? 1: -1 ];
        (void) sizeof(type_must_be_complete);
        delete x;
    }
    Si le type n'est pas complet, ca ne compile même pas.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    merci pour vos réponses, il faut que je me penche sur tout ça

  10. #10
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut
    qu'appel t-on un type complet ?

  11. #11
    Membre éclairé Avatar de metagoto
    Profil pro
    Hobbyist programmateur
    Inscrit en
    Juin 2009
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Hobbyist programmateur

    Informations forums :
    Inscription : Juin 2009
    Messages : 646
    Points : 845
    Points
    845
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    qu'appel t-on un type complet ?
    Un type entièrement connu du compilo à un instant t. Le type est entièrement déclaré.
    Si le type n'a eu qu'une forward declaration, toujours à un instant t, il est qualifié d'incomplet.

Discussions similaires

  1. Gestion de mémoire dans Java ?
    Par nolofinwe dans le forum Langage
    Réponses: 13
    Dernier message: 10/01/2008, 13h37
  2. Validité d'un code VBA+SQL pour gestion de mémoire
    Par stefposs dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/09/2007, 13h32
  3. Problème de gestion de mémoire (segfault)
    Par Michaël dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 09h30
  4. Réponses: 5
    Dernier message: 27/03/2007, 09h51
  5. Gestion de Mémoire Java
    Par lebulls dans le forum Langage
    Réponses: 5
    Dernier message: 18/07/2006, 10h35

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