Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur les cascades de destructeur

Sujet résolu
    16 janvier 2019 à 23:03:19

    Bonjour,

    Pour commencer, je crois qu'une mise en situation s'impose.

    J'ai comme projet de créer un bras robotique, et j'ai choisi de faire la programmation d'un logiciel pouvant le contrôler en c++. En gros, j'ai un objet «bras», qui contient un pointeur vers un objet «main», qui contient des pointeurs vers des objets «doigt», qui contiennent des pointeurs  vers des objets «phalange». Chaque pointeur est privé, de façon à respecter l'encapsulation. Chaque objet contient un destructeur avec un «delete» du (ou des) pointeur(s). J'ai été contraint (sous les injures de mon compilateur) à faire ainsi.

    Lors de la fin du programme (l'objet bras est créer dans la fonction main, donc lors du return 0), le destructeur du «bras» va être appelé, ce qui va causer le «delete» de l'objet «main». Est-ce que le «delete» de l'objet «main» va appeler son destructeur, qui contient le «delete» des objets «doigt» et ainsi de suite jusqu'à la destruction totale de tout les pointeurs? 

    • Partager sur Facebook
    • Partager sur Twitter
      16 janvier 2019 à 23:11:57

      Factao a écrit:

      Est-ce que le «delete» de l'objet «main» va appeler son destructeur, qui contient le «delete» des objets «doigt» et ainsi de suite jusqu'à la destruction totale de tout les pointeurs? 

      Oui.

      (Les destructeurs sont toujours appelés, sauf si l'objet n'a pas fini d'etre construit - exception dans le constructeur -, ou en cas de std::terminate/std::abort)

      Factao a écrit:

      J'ai été contraint (sous les injures de mon compilateur) à faire ainsi.

      Du coup, c'est le compilateur qu'on doit injurier pour utiliser des pointeurs nus au lieu de valeurs ou de pointeurs inteligents ?

      • Partager sur Facebook
      • Partager sur Twitter
        16 janvier 2019 à 23:32:05

        Non, le compilateur fait son boulot, c'est plutôt mon inexpérience qu'il faut blamer.

        Sinon, merci.

        • Partager sur Facebook
        • Partager sur Twitter
          17 janvier 2019 à 16:29:31

          Salut,

          En fait, la question de gbdivers doit être comprise dans le sens de

          Pourquoi avoir utilisé des pointeurs (et surtout des pointeurs nus, alors qu'il existe depuis 8 ans des pointeurs intelligents, comme std::unique_ptr)dans l'histoire?

          Ton approche semble indiquer que les doigts, la main et les phalanges peuvent exister "séparément", vu que tu as utilisé des pointeurs, mais tu veux revenir sur ta décision en voulant forcer le destructeur de tes objets à ... les détruire.

          Il faut choisir : si la main, ne peut pas exister sans qu'il n'y ait un bras, si les doigts ne peuvent pas exister sans qu'il n'y ait une main, si les phalanges ne peuvent pas exister sans qu'il n'y ait un doigts, tu n'as aucune raison d'utiliser des pointeurs (*)

          Et si tu veux vraiment utiliser des pointeurs, le seul fait que tu veuilles que le bras libère la mémoire de la main quand il est détruit, que la main libère celle des doigts quand elle est détruite et que les doigts libère la mémoire des phalanges quand ils sont détruits implique que tu veux donner le statut de "propriétaire légal", qui la le "droit de vie et de morts à ces éléments, et, par conséquent, qu'il seront les seuls propriétaires de ces éléments (une main ne pouvant pas appartenir à plusieurs bras en même temps)

          la classe std::unique_ptr a été spécialement conçue pour cela.  Tu devrais l'utiliser ;)

          (*)Sauf cas particulier dans lequel la classe main, la classe doigt ou la classe phalange interviendraient dans une hiérarchie de classe, s'entend.  Et même à ce moment là, l'utilisation de pointeur resterait sujette à discussion.

          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            24 janvier 2019 à 18:25:53

            Merci de ta réponse éclairée, koala01. Je crois que les pointeurs n'étaient simplement pas requis pour ce que je voulais faire. Il est vrais que rien ne peut exister si le bras n'existe pas. J'aurais pu simplement intégrer les objets dans le bras en tant que tel, et non utilisé des pointeurs.
            • Partager sur Facebook
            • Partager sur Twitter

            Question sur les cascades de destructeur

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown