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 :

comment "deleter" un pointeur static d'une classe?


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut comment "deleter" un pointeur static d'une classe?
    Bonsoir à tous!
    J'ai déclaré dans une classe A un pointeur static vers une classe B.
    Plusieurs objet d'une classe C, dérivée de A sont instantiés.
    Je ne parviens pas à "deleter" correctement mon pointeur static dans ma classe A.

    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
    17
    #include "B.h"
    
    class A
    {
            public:
            A();
            virtual ~A();
            protected:
            static B* p;
    };
    
    B* A::p;
    A::A(){p=new B;}
    A::~A(){
    delete p;
    if(p) delete p;->mes deux essais produisent une erreur à l'execution
    }

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Déjà, il y a un énorme risque de fuite de mémoire dans ton code...

    En effet, que va-t-il, selon toi, se passer - avec le constructeur de ta classe A - si tu viens à déclarer deux objets de la classe A, et dés avant la destruction de l'un d'eux

    Ensuite, que va-t-il, toujours selon toi, se passer lorsque le deuxième objet sera détruit si tu viens à libérer la mémoire allouée dynamiquement pour le pointeur statique
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Bonjour!
    Pour ta première remarque, je pensais que le mot "static" me mettait à l'abri. Mon pointeur se sera-t-il pas unique quoi qu'il arrive?
    Pour la deuxieme remarque, c'est l'objet de ma question. Peut-être puis mettre en place un compteur static du nombre de classe A et libérer la mémoire du pointeur uniquement lorsque le compteur chute à zero?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Oui, un comptage de références devrait bien marcher.

    Mais la raison principale "flagrante" de ton plantage, c'est que tu ne remettais pas le pointeur à NULL après ton delete...
    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é
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2005
    Messages
    244
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Philippines

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2005
    Messages : 244
    Points : 609
    Points
    609
    Par défaut
    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
    17
    18
    19
    class A
    {
            public:
            A();
            virtual ~A();
            protected:
            static B* p;
    };
     
    B* A::p = NULL;
     
    A::A(){ if(!p) p=new B;}
     
    A::~A(){
      if(p) { 
      delete p;
      p = NULL
      }
    }
    (cependant si ce code compile et ne plante pas, il n'a aucun interet, un compteur de refs comme dit plus haut ferait bien mieux l'affaire!)

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Bonsoir!
    Je me demande pourquoi l'option avec un compteur semble plus vous plaire?
    Je trouve le code de anykeyh beaucoup plus élégant....
    euuh...désolé...j''ai lu trop vite. Un compteur répond mieux à mes attentes.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 07/06/2012, 21h49
  2. Attributs static d'une classe
    Par Edouard Kaiser dans le forum C++
    Réponses: 15
    Dernier message: 04/04/2006, 00h17

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