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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    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 très actif 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
    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
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9
    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
    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
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    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 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
    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 : 50
    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
    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.

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