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] [pas appelé]


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut [destructeur] [pas appelé]
    Je construit plusieurs objet et par après je fais appel à delete pour les détruire et récupérer la mémoire.

    Pour vérifier que le destructeur est bien appelé, j'y ai mis une fonction qui écrit dans un fichier (elle fonctionne bien cette fonction). Seulement pas un seul ptit message dans le fichier de réception... (il n'y a aucun problème avec la fonction d'écriture, je rappel)

    Donc je me dis, "ben, tiens, mes destructeurs sont pas appelés. Pas normal ca..."

    Alors voilà, est-ce que je peux mettre du code (par exemple ma fonction d'écriture) dans un destructeur ?
    Et est-ce normal que j'ai rien dans mon fichier de réception ?

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 670
    Points
    10 670
    Billets dans le blog
    3
    Par défaut
    Ta conclusion est bien hative. Un break point serait plus fiable comme test, ou simplement un affichage sur cout.
    Normalement tes detructeurs sont toujours appelés. Les exceptions que je connais sont:
    - si le constructeur a échoué (exception)
    - destruction polymorphique sans destructeur de base virtuel (comportement indéfini) -> voir FAQ
    - bug de certains compilos, avec les objets statiques en particulier (tu peux éliminer cette piste)

    Mais là je dirai que c'est ton test qui est suspect.

  3. #3
    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
    Il y a de l'héritage, dans tes classes?
    Une sombre histoire de destructeur virtuel?
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut
    Je viens de faire le barbare en faisant l'appel à exit(0), rien. J'ai utilisé un breakPoint, rien...

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut
    ma classe ne dérive de rien. C'est juste un simple Node dans une liste.

    Mais ma méthode d'écriture de fichier est sans problème. Je l'emplois tout le temps et elle ne se plante jamais. (d'ailleurs en général je l'employais pour m'aider à débugger)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 92
    Points : 101
    Points
    101
    Par défaut
    Tu devrais poster ton code

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut
    voilà en gros ma classe Node

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Node::Node(Data * d)
       {
           data = d;
           previous = false;
           next = false;
       }    
     
     
    Node::~Node()
       {
          delete(
       }

    et voici mon code, de la construction à la destruction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           Node * n = liste->getFirst();
           to->printFile("bon", "y");
           while(n!=false)
              {
                  .....
                  n = n->getNext();
              } 
           delete n;
    le code se lit bien jusqu'au bout. Delete est lu pourtant.

    Pourriez vous me dire comment utiliser try catch avec mon destructeur ?

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    Points : 121
    Points
    121
    Par défaut
    si tu veux tester tes objets en mémoire dynamique, une méthode qui marche bien c'est surcharger tes operateur new et delete ... (comme tu parles de delete ...

    Comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    // Surcharge de new et delete
          void* operator new (size_t size) {
                void* p = malloc(size);
                cout << " Objet de MaClasse alloué à l'adresse " << p << "      pour " << size << " octets " << endl;
                return p;
                }
     
          void operator delete (void* p,size_t size) {
                cout << " Adresse suivante (MaClasse) libérée : " << p << " de " << size << " octets " << endl;
                free(p);
                }
    Au moins tu verras bien si tout se libère

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut
    Je rajoute une question :


    je crée un pointeur : Node * n
    J'effectue une copie de pointeur : n = nAutre
    je détruit n : delete n

    que devient nAutre ?

    Je veux juste que le pointeur n soit libéré mais l'objet en lui meme ne doit pas etre détruit car toujours référé par nAutre.

    Je suppose que delete n, ca détruit tout meme l'objet laissant nAutre tout seul pointant sur rien.

  10. #10
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Un pointeur ça ne se libère pas, ça prend juste une adresse.
    Si tu veux que ton poineur ne pointe plus sur un objet, tu peux lui donner la valeur NULL.

    Si tu veux détruire l'objet pointé par un pointeur, tu utilise l'opérateur delete.


    Et pour revenir sur ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           Node * n = liste->getFirst();
           to->printFile("bon", "y");
           while(n!=false)
              {
                  .....
                  n = n->getNext();
              }
           delete n;
    Tu fais une comparaison entre un pointeur et un booléen (n!=false) ... ce n'est vraiment pas propre.
    De plus, lorsque tu sors de la boucle, le pointeur vaut NULL, et tu effectue donc "delete NULL;", ce qui ne fait rien ...

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut
    C'est vrai que j'ai tendance à utiliser les booleans. Mais bon, je comprend pas pourquoi il vaudrait NULL, d'accord si on le déclare à l'intérieur, mais là, n est déclaré avant la boucle et les éléments dans liste->getFirst() aussi.

    c'est un peu comme si je faisais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int i = 0;
     
       {
       i = 1;
       }
    en dehors de la boucle, i vaudra quand meme 1. A moins qu'il y a une notion que j'ai pas capté pour les objets.

    Mais cela répondrait bien à mon problème. Ce qui me laisse croire que mon argument ci dessus est mauvais.[/code]

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    Points : 69
    Points
    69
    Par défaut
    je viens de comprendre désolé !!! il devient NULL effectivement car justement je fais un test comparatif dans la boucle... normal alors que delete NULL ne donne rien.

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

Discussions similaires

  1. Un destructeur qui n'est pas appelé ?
    Par souki22 dans le forum C++
    Réponses: 7
    Dernier message: 30/01/2015, 10h19
  2. destructeur pas appelé ?
    Par NiamorH dans le forum C++
    Réponses: 28
    Dernier message: 27/04/2007, 16h20
  3. Réponses: 9
    Dernier message: 07/10/2006, 10h54
  4. [servlet][filtre] filtre qui n'est pas appelé
    Par felix79 dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 29/06/2005, 20h09
  5. setTimeOut ne peu pas appeler une fonct. et appeler une var?
    Par bywazy dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/06/2005, 09h56

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