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 :

Destruction par récurrence


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Par défaut Destruction par récurrence
    Salut !

    J'ai un problème pour effacer un objet par récurrence, sur un exemple simplifié, ce serait :
    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 C
    {
        C* next;
     
        C()    //Mon constructeur
        {
            next = 0;
        }
     
        ~C()    //Mon destructeur défini par récurrence
        {
            if (next != 0)
            {
                next->~C();
            }    //A cette étape, next ne contient qu'un pointeur nul
            delete(next);    //Pour libérer la mémoire lorsque next ne contient plus qu'un pointeur nul
            next = 0;    //Pour que la récurrence continue
        }
    };
    Pensez-vous que cela pourrait marcher ou je dois définir une fonction récurrente "effacer" que j'appelle dans le destructeur ?
    Un autre problème est que je ne peux utiliser que "new" et non "malloc" pour créer un élément "next" car j'utilise delete.

    PS : je sais qu'il y a des choses très bien définies dans la STL mais j'ai besoin de savoir résoudre cet exemple "simple" pour ma structure.

  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
    Ton destructeur peut se limiter à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ~C()
    {
        delete next;
    }
    • delete NULL est tout à fait valide (le test est donc inutile)
    • delete va appeler le destructeur, donc si tu le fais toi-même avant ça va coincer
    • mettre le pointeur à zéro est inutile, puisque ton objet est en train d'être détruit


    Un autre problème est que je ne peux utiliser que "new" et non "malloc" pour créer un élément "next" car j'utilise delete.
    Pourquoi serait-ce un problème ? Le problème aurait été d'utiliser malloc alors que tu codes en C++.

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Par défaut
    Mais dans ton programme, où est le test d'arrêt ?
    Il est sous-entendu dans le delete ?

    Je pensais que delete appelait le destructeur, puis libérait l'espace mémoire.
    Donc, imagine l'exemple suivant, j'ai un objet c de type C, qui contient next, pointeur nul.
    Si je fais "delete(c)", l'ordinateur fait :
    - appel du destructeur sur c (de type C)
    - il lit alors "delete next" qui est ici nul
    - next est de type C aussi, donc l'ordinateur ne va-t-il pas ensuite chercher à utiliser encore mon destructeur, ce qui aboutirait à une erreur ? Ou fait-il implicitement le test de nullité et alors, ne fait rien ?

  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
    Ou fait-il implicitement le test de nullité et alors, ne fait rien ?
    Oui, comme je te l'ai dit delete NULL est valide (et donc ne fait rien).

  5. #5
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 58
    Par défaut
    Ok merci beaucoup pour l'aide

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

Discussions similaires

  1. Soucis raisonnement par récurrence
    Par NiamorH dans le forum Mathématiques
    Réponses: 2
    Dernier message: 31/07/2009, 16h44
  2. Raisonnement par récurrence
    Par Bovino dans le forum Enigmes
    Réponses: 3
    Dernier message: 09/02/2009, 13h33
  3. [Thread] et destruction par fermeture appli
    Par Droïde Système7 dans le forum Débuter
    Réponses: 8
    Dernier message: 15/12/2008, 19h17
  4. [MySQL] Lister un nombre de résultats par récurrence
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 04/02/2007, 20h53
  5. x² et puissance de x par récurrence
    Par olivieram dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 15/12/2002, 23h59

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