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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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 confirm�

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

    Informations professionnelles :
    Activit� : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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 confirm�
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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 confirm�
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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 confirm�
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    92
    D�tails du profil
    Informations personnelles :
    �ge : 37
    Localisation : France, Paris (�le de France)

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

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

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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 �prouv�
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    109
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 109
    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 confirm�
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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 �prouv�
    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 : 40
    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
    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 confirm�
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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 confirm�
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    97
    D�tails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 97
    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