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 :

Destructeur de classe - remise à NULL


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut Destructeur de classe - remise à NULL
    Bonjour,

    J'ai créé une classe d'objet.

    Ces objets appartiennent à un conteneur.

    Celui-ci ne sait pas forcement à l'avance si un de ses objet est déjà créé. Par exemple, si on demande d'ouvrir un objet, le conteneur verifie si il existe :

    - si il existe, il l'ouvre
    - sinon il le crée puis il l'ouvre

    Donc pour savoir si un objet est déjà créé, lors de la création du conteneur, j'initialise la liste de pointeurs vers ses objets à NULL, comme ça je peux tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ouvrirObjet(*pObjet)
    {
        if (pObjet == NULL)
            pObjet = new cObjet();
        pObjet->ouvrir();
    }
    Sauf que lorsque l'on detruit un objet avec delete, le pointeur vers cet objet ne revient pas à NULL...

    Donc ma question : est-il possible de mettre ce pointeur à NULL à l'intérieur du destructeur ?

    Un truc du genre this = NULL; mais en plus fin, puisque ça c'est interdit....

    Merci !

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Donc ma question : est-il possible de mettre ce pointeur à NULL à l'intérieur du destructeur ?
    Non, mais rien ne t'empêche de le faire juste après le delete.

  3. #3
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ah !

    Evidemment, j'oubliais de preciser, le delete est automatique...

    J'ai une procedure fermerObjet() qui peut etre appelée depuis l'objet lui-meme et qui à la fin fait execute :

    delete this;

    Donc lors de l'execution du destructeur, je ne connait pas le pointeur vers l'objet.

    Du coup je pensais à une astuce du genre :

    - à la construction, stocker un pointeur vers le pointeur de l'objet (!!!!)
    - à la destruction, mettre la valeur pointée par ce pointeur à NULL

    C'est un peu tordu, et ça n'a pas vraiement marché (je m'y suis peut-etre mal pris)

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ca devient un peu bourrin là

    Tu pourrais détailler un peu plus ce que tu cherches à faire ? Je suis sûr qu'on peut trouver une solution plus élégante.

  5. #5
    Membre éclairé
    Avatar de buzzkaido
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2004
    Messages
    821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2004
    Messages : 821
    Par défaut
    Ouais, je vais essayer d'etre plus clair :

    J'ai un conteneur, qui contient 4 objets (par exemple)

    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cConteneur
    {
        cObjet    *pObjet1;
        cObjet    *pObjet2;
        cObjet    *pObjet3;
        cObjet    *pObjet4;
    }
    Le constructeur : (aucun objet n'existe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    cConteneur::cConteneur()
    {
        pObjet1 = NULL;
        pObjet2 = NULL;
        pObjet3 = NULL;
        pObjet4 = NULL;
    }
    Le destructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    cConteneur::~cConteneur()
    {
        if (pObjet1  != NULL) delete pObjet1;
        if (pObjet2  != NULL) delete pObjet2;
        if (pObjet3  != NULL) delete pObjet3;
        if (pObjet4  != NULL) delete pObjet4;
    }
    Ouvrir un objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cConteneur::ouvrirObjet(uneCondition)
    {
        switch (condition)
        {
           case condition_1 :
               if (pObjet1 == NULL) pObjet1 = new cObjet();
               pObjet1->ouvrir();
               break;
           case condition_2 :
               if (pObjet2 == NULL) pObjet2 = new cObjet();
               pObjet2->ouvrir();
               break;
           etc
           ......
        }  
    }
    Et dans cObjet : (cette méthode est appelée sous certaines conditions : fin du traitement...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cObjet::fermer()
    {
        fermerDesTrucs();
        delete this;
    }
    Donc mon probleme, c'est que si le conteneur ouvre un objet et que celui-ci s'est fermé (+ détruit) tout seul, le conteneur n'est pas au courant qu'il doit le ré-créer avant de le ré-ouvrir.....

    Et pour d'autres raisons, je voudrait éviter de stocker un pointeur vers le conteneur dans chaque objet (les objets peuvent changer de conteneur etc...)

    Donc mon vrai probleme, c'est de tester l'existence d'un objet via son pointeur....

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tu as une architecture pas facile à gérer, où la responsabilité des ressources est partagée entre le conteneur et la ressource elle-même. Un truc qui aiderait bien serait les pointeurs intelligents à base de comptage de référence, ça éviterait déjà d'avoir à gérer des dépendances partout. Avec boost::weak_ptr je crois même que tu peux être notifié lorsque le boost::shared_ptr lié est détruit, ce qui pourrait convenir dans ton cas.

    Bien sûr la solution la plus simple serait qu'une seule classe ait la responsabilité entière des ressources, mais apparemment ce n'est pas possible dans ton cas.

    PS : delete NULL est tout à fait valide, pas besoin de tester le pointeur.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 43
    Par défaut
    pourquoi tu fais pas une fonction qui ferai à peu près ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CContainer::liberer(*Objet)
    {
           Objet->fermer();
           Objet = NULL;
    }
    non ?


    - Hé dis t'as vu Travail quelque part ?
    - Non, moi je suis en vacances...

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2003
    Messages
    272
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 272
    Par défaut
    Citation Envoyé par buzzkaido
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cObjet::fermer()
    {
        fermerDesTrucs();
        delete this;
    }
    Ca me parait vraiment bizzare, un objet qui appelle son propre destructeur...
    En particulier, l'objet existe encore juste après puisqu'on est dans une de ses méthodes.

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

Discussions similaires

  1. [WD16] Destructeur de classe appelé après arrêt thread contenu dans méthode
    Par jurassic pork dans le forum WinDev
    Réponses: 9
    Dernier message: 27/07/2012, 03h21
  2. Réponses: 2
    Dernier message: 30/03/2012, 12h45
  3. [AIR] PopupManager + Class + ref null
    Par zabdoul dans le forum Flex
    Réponses: 1
    Dernier message: 05/11/2010, 15h08
  4. Création d'un destructeur de classe
    Par hellspawn_ludo dans le forum Windows Forms
    Réponses: 6
    Dernier message: 25/08/2007, 23h24
  5. [Forms10g] remise à null de variables de librairie
    Par Bonnie38 dans le forum Forms
    Réponses: 2
    Dernier message: 18/04/2007, 10h31

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