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 :

Appel destructeur qui ne se fait pas


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Par défaut Appel destructeur qui ne se fait pas
    Bonjour tout le monde,

    j'optimise actuellement un projet que j'ai a faire, et donc je vérifie le nombre d'appels de destructeur effectué (grace à des variables globales: je sais que ce n'est pas bien mais c'est juste pour le test) pendant le programme, il s'agit d'une liste doublement chainée avec un mSuivant et mPrecedent (vers des classes type umh.

    Donc je vous présente mon destructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    umh::~umh(void){
     
                    delete mSuivant;
                    delete mPrecedent; 
                    CD++;
                    }
    Un parcours d'une liste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Materiau::Affiche(void){
         cout<<"Affichage"<<endl;
         umh *test;
         Parametre Param;
         test=new umh;
         test=*mTete;
         while(test){
                     test->AfficheAdresse();     
                     test=test->Suivant();
                     }
             delete test;
                    }
    et enfin ma fonction qui affiche le nombre d'appel de constructeurs et destructeurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void umh::Verification(void){
     
         cout<<"Nombre d'appels de constructeur:    "<<CC<<endl;
         cout<<"Nombre d'appels de destructeur:     "<<CD<<endl;
         }

    Bon rien de compliqué me direz vous, cependant à la sortie "de Affiche" la variable CD vaut toujours 0...Comment se fait se?

    Une autre question: mon destructeur vous parrait t-il correct?

    MMerci pour vos réponses!

  2. #2
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonsoir,
    Voila le problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    test=new umh; //Ici on alloue
    test=*mTete; //Ici on perd le pointeur qui vient d'être alloué. C'est une fuite mémoire.
    while(test) //On fait des chose tant que test != NULL
    {
      test->AfficheAdresse();     
      test=test->Suivant();
    }
    delete test;//Donc ici test est forcement null
    Il n'y as aucune désalocation dans ce code.

    Une autre question: mon destructeur vous parrait t-il correct?
    Si "umh" est un nœud de ta liste, et qu'il delete a la fois le suivant et le précédent, il y auras forcement des nœuds desaloué deux fois.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Par défaut
    Salut Nogane,Salut Julien Du Sud,

    en effet la ligne new umh ne sert à rien, je pense que si je la supprime cela va éviter une fuite mémoire...
    cependant, a la sortie de la fonction affiche, il faut bien "liberer" test non puisqu'il a été appelé avec new?
    Dans ce cas le delete devrait faire un appel destructeur et m'incrémenter ma variable de 1 ce qui n'est pas le cas...

  4. #4
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    un new est à coupler avec un delete, mais si tu ne fais pas de new, il n'y a pas de delete à faire.

    Un pointeur n'est pas forcément une donnée allouée dynamiquement. Et il n'y a pas de delete à faire pour les données allouées statiquement, étant donné que celles-ci sont détruites lorsqu'elle sort de sa portée.

    Tu devrais voir la FAQ et quelques tutoriels...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 34
    Par défaut
    Je pense que je viens de tilter...
    En fait quand j'ai un pointeur p=NULL, faire delete p ca sert à rien? Moi je pensais que le fait que le pointeur pointait vers 0 et que la mémoire était désalouée ne voulait pas dire la même chose...Peut être que tout est entrain de s'embrouiller dans ma tête aussi

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Faire un delete sur un pointeur à NULL ne fait rien, et justement c'est ça qu'est bien. (par rapport au code que t'a montré juliendusud pour éviter deux désallocations).

    Sinon l'exercice c'est d'implémenter la liste? Parce que si c'est pour être utilisé t'as std::list qui est une liste doublement chainée .

  7. #7
    Membre chevronné
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Par défaut
    Et je rajouterais, pour le destructeur, vu qu'il n'y a pas mise à null de pointeurs, tu vas faire des delete multiples, et le comportement est indéfini.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mSuivant->mPrecedent = null;
    mPrecedant->mSuivant = null;
    delete mPrecedant;
    delete mSuivant;

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

Discussions similaires

  1. [Mail] Envoi d'e-mail qui ne se fait pas
    Par sam01 dans le forum Langage
    Réponses: 3
    Dernier message: 26/07/2007, 10h41
  2. rsync : sauvegarde incrementale qui ne se fait pas
    Par nixonne dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 22/07/2007, 12h11
  3. [Tableaux] création de tableau qui ne se fait pas
    Par mussara dans le forum Langage
    Réponses: 2
    Dernier message: 01/11/2006, 21h44
  4. Test qui ne se fait pas
    Par GLDavid dans le forum Linux
    Réponses: 12
    Dernier message: 07/03/2006, 14h57
  5. Pb de selection qui ne se fait pas
    Par Stef.proxi dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/08/2004, 10h54

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