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 :

petites questionS concernant les destructeurs .


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut petites questionS concernant les destructeurs .
    Bonjour a tous
    Ca fait longtemps que je tourner autour du pot, et j'ai décidé de m'y mettre ... de géré un peu la destruction de mes objets . J'ai un petit nombre de question ( certain trés rapide a vous posez, histoire de voir si j'ai comprit , et de comprendre ce qui m'échappe encore . )

    Un objet menbre ( pas un pointeur , on dit statique, non ? ) est toujours détruit lorsque le destructeur de la classe est appelé ... donc pas besoin de s'en soucier . Je supose que c'est valable avec les conteneur de la STL par exemple ?

    EDIT : en parlant de la stl ; si j'ai une map ou un vector contenant des pointeur , ayant fait l'objet d'un new ... comment se passe de deletion de ceux-ci ? Est-ce a moi de la faire ? comment ?

    Un objet menbre de type pointeur est aussi toujours détruit si il n'est pas associé a un new mais fait seulement l'objet d'affectation c'est ca ?

    En regardant la FAQ , je vient d'apprendre qu'un objet avait pour durée de vie Une accolade ... interessant . Est-ce aussi valable epour un pointeur ?
    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
         cObjet * obj ;
         obj = MonObjet ;
    }
    Le pointeur est détruit aprés al 2eme accolade c'est ca ?

    Heu sinon j'ai du mal avec les singleton ...
    Une de mes classe contient un pointeur vers une classe singleton .
    Je n'ai de new nulle part donc ... La destruction est-elle automatqiue ?

    En fait en regardant mon code, je ne trouve pas un seul new O_o ... je suis qu'il y en un ou deux quelque part mais sans plus ...

    Ca me ramène a une question que je me pose depuis longtps .
    Quel intéret a mettre en variable menbre par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    cItem * item ;
    ou
    cItem item ;
    Je ne suis jamais parvenu a trouver un cas dans lequel une des deux déclaration me posait problème .
    On dirai que trés souvent dans les code que je trouve sur le net on privilégie la forme dynamique ... est-ce que ca a intérêt particulier? ou alors est-ce que ca comble un désavantage de la forme "statique" ?

    Merci

  2. #2
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Salut,

    En effet, les variables membres de ta classe par valeur son détruites automatiquement. Par exemple, ici l'entier et l'instance de AutreClasse seront détruits (pour l'entier, il ne se passe pas grand chose, pour l'instance, son destructeur sera appelé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Truc
    {
         int                  m_iValeur;
         AutreClasse    m_Instance;
    };
    Pour le cas des pointeurs, il faut bien faire la distinction entre
    1. le pointeur (qui sert juste à stocker l'adresse)
    2. l'objet pointé (l'objet vers lequel tu pointes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class Truc
    {
         AutreClasse*   m_pPointé;
         AutreClasse*   m_pAlloué;
    };
     
    m_pPointé = adresse quelconque;  // pointer vers un objet
    m_pAlloué = new Objet;   // allouer un objet et pointer dessus
    Ici, quand ton instance de Truc sera détruite, les deux pointeurs seront détruits.... par contre, l'objet que tu as alloué ne le sera pas .... il faudra donc faire un delete m_pAlloué pour le supprimer.

    En regardant la FAQ , je vient d'apprendre qu'un objet avait pour durée de vie Une accolade ... interessant . Est-ce aussi valable epour un pointeur ?
    ex :
    Code:

    {
    cObjet * obj ;
    obj = MonObjet ;
    }


    Le pointeur est détruit aprés al 2eme accolade c'est ca ?
    Il doit manquer quelquechose dans ton code ... si c'est
    alors non, le pointeur est "détruit" (il est sorti de sa portée, comme tu le disais, c'est le bloc d'accolades qui l'entoure), mais l'objet pointé est toujours là .... il faut donc un delete....

    Si c'est juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
       MonObjet   truc;
       MonObjet*  p = &truc;
    }
    Ton objet (par valeur) est détruit tout seul, et le pointeur aussi.... il n'y a nullement besoin de détruire l'objet sur lequel il pointe (puisque il s'est déjà détuit tout seul)...

    Donc en fait, retiens surtout new -> delete , pas de new -> pas de delete


    Pour ce qui est des singletons, c'est particulière puisqu'ils s'allouent eux-mêmes Généralement, tu trouveras une méthode getInstance() pour récupérer un pointeur vers l'instance (et la créér si elle n'existe pas encore), et une méthode destroy pour détruire l'instance quand tu sera sur de ne plus en avoir besoin (mais bon au pire elle sera recréee au prochain coup).

    Sinon, euh pour ta dernière question, regarde vers ce post, je crois que y'a quelques éléments de réponse (composition, aggrégration, ...):
    http://www.developpez.net/forums/vie...er=asc&start=0)

    Voilà, je sais pas si j'ai été très clair, mais bon
    Tu me diras ....


    EDIT:
    EDIT : en parlant de la stl ; si j'ai une map ou un vector contenant des pointeur , ayant fait l'objet d'un new ... comment se passe de deletion de ceux-ci ? Est-ce a moi de la faire ? comment ?
    En effet, ton vecteur sera détuit tout seul, mais l'ensemble des objets que tu as alloué ne le seront pas. Il faut donc que tu parcours ton vecteur, et que tu fasse un delete de chaque objet pointé...
    And still we will be here, standing like statues ...

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Tout d'abord merci de tes réponses

    Pour le cas des pointeurs, il faut bien faire la distinction entre
    1. le pointeur (qui sert juste à stocker l'adresse)
    2. l'objet pointé (l'objet vers lequel tu pointes)
    C'est tout bête mais j'ai tendance a m'emêller les pinceaux , merci du rappel !

    Je prend note du reste, rien a redire, je pense avoir comprit .

    Concernant les singleton , oui ma methode get st toujours sur le meem principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cRessourcesManager & cRessourcesManager::GetInstance()  
    { 
    	static cRessourcesManager instance ;
    	return instance ;  
    }
    je doit faire aussi une methode destroy ? qui fait quoi ? Car pour moi , mon objet n'est pas dynamique, je ne ferais donc pas de "delete instance" ...

    je vais de ce pas lire ton lien ; je suis entrain de tester 2-3 truc, je revient ici si j'ai des problémes
    merci encore .

  4. #4
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Citation Envoyé par Clad3
    Tout d'abord merci de tes réponses
    Concernant les singleton , oui ma methode get st toujours sur le meem principe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    cRessourcesManager & cRessourcesManager::GetInstance()  
    { 
    	static cRessourcesManager instance ;
    	return instance ;  
    }
    je doit faire aussi une methode destroy ? qui fait quoi ? Car pour moi , mon objet n'est pas dynamique, je ne ferais donc pas de "delete instance" ..
    Ah! euh à vrai dire je n'avais jamais pensé à l'implémenter comme ça ..... perso j'avais un new(), et donc bien sûr le delete qui va avec ....
    mais là, visiblement tu n'aurais pas besoin de méthode destroy() .... peut être que quelqu'un peut confimer ça ?

    Si c'est vraiment ça, ta méthode m'a l'air vraiment mieux puisqu'on n'a pas a se soucier de la destruction du singleton...
    And still we will be here, standing like statues ...

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Tient je vient de m'appercevoir qu'un de mes objet n'était JAMAIS détruit .. je vais enquêter .. c'est un objet contenu dans une map , un objet dérivée d'une classe abstraite ... hum on va s'amuser, je crois que la FAQ en parle, j'y retourne

    edit : je vient d'y jeter un oeil : alors je retient que:

    si je dérive un objet d'une classe mére , je ne doit apeller le destructeur de la classe dérivé QUE lorsque mon pointeur na pas fait l'objet d'un new , c'est ca ?

  6. #6
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Euh je ne suis pas sûr de comprendre....
    la "règle" est toujours la même normalement, si tu as alloué ton objet avec un new (peu importe s'il a une classe mère), il faut le desallouer avec un delete.

    Après, dans le destructeur de cette classe dérivée, il ne faut pas appeler le destructeur de la classe mère (ça se fait tout seul). Et de plus, il faut bien penser à spécifier que ce destructeur est virtuel dans la classe mère. C'est ce qui va déclancher la liaison dynamique, donc permettre à ce code de s'exeucter comme il faut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Mere
    {
       virtual  ~Mere()  {}
    };
     
    class Fille : public Mere;
     
    Mere* p = new Fille;
    delete p;
    Ici, si le destructeur de Mere n'avait pas été virtuel, au moment du delete, ça n'aurait desalloué que la mère (puisque le type apparent du pointeur, c'est Mere, et pas Fille).

    C'etait ça ta question ?
    And still we will be here, standing like statues ...

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    hum hum, je vais méditer ca , ... je suis encore un peu confus la dessus

    Edit : oki je commence a comprendre ... ma confusion venait me mon manque de connaissance sur la représentation en mémoire des classe dérivée de la sorte .
    Je vient de mettre en pratique tout ca, ca a l'air de marcher
    Pour 3 objet ca me donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Fille détruite
    Mère détruite
    Fille détruite
    Mère détruite
    Fils détruite
    Mère détruite
    Avec Fils / Fille des classe dérivée de Mère .
    Merci encore

  8. #8
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par bigquick
    Citation Envoyé par Clad3
    [snip singleton façon (More?) Effective C++ de (EC++) Scott Meyers]
    Ah! euh à vrai dire je n'avais jamais pensé à l'implémenter comme ça ..... perso j'avais un new(), et donc bien sûr le delete qui va avec ....
    mais là, visiblement tu n'aurais pas besoin de méthode destroy() .... peut être que quelqu'un peut confimer ça ?

    Si c'est vraiment ça, ta méthode m'a l'air vraiment mieux puisqu'on n'a pas a se soucier de la destruction du singleton...
    Disons que c'est bien pour faire des variables globales déguisées en singletons.

    Dès qu'il y a des aspects concurrents, ou de dépendances jusque dans la destruction, il faut se tourner vers d'autres modèles comme ceux de Loki (Modern C++ Design, d'Andrei Alexandrescu, qui dispose d'un chapitre très intéressant sur les singletons) ou d'ACE (Schmidt, dans ses articles, on trouve un document sur les lifetime managers, toujous dans cette même optique).
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    Dites, les vecteurs sont des listes chaînées non ?

    Et c'est quoi les maps ?
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  10. #10
    Membre averti
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Points : 353
    Points
    353
    Par défaut
    Euh non, un vecteur est un tableau dynamique, redimentionnable, et alloué par blocs.... et une map c'est un conteneur associatif (clé -> valeur)

    cf. la faq pour plus d'infos, par exemple: http://c.developpez.com/faq/cpp/?page=STL#STL_vector

    Mais pourquoi cette question ici ??
    And still we will be here, standing like statues ...

  11. #11
    Membre régulier
    Inscrit en
    Avril 2005
    Messages
    230
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 230
    Points : 122
    Points
    122
    Par défaut
    C'est juste que Clad3 avait l'air de savoir ce que c'était et que je ne voulais pas créer un topic pour une petite question.
    Mes sites :
    - Portail : http://www.azharis.fr/
    - Neuroshima Hex : http://neuroshima-hex.azharis.fr/
    - Monolith Arena : http://monolith-arena.azharis.fr/

  12. #12
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Pas de pb

Discussions similaires

  1. Petite incompréhension concernant les destructeurs
    Par Francky44003 dans le forum Débuter
    Réponses: 7
    Dernier message: 11/02/2011, 16h57
  2. Réponses: 5
    Dernier message: 17/03/2009, 20h59
  3. Réponses: 2
    Dernier message: 07/05/2007, 16h46
  4. Réponses: 7
    Dernier message: 10/09/2004, 14h28
  5. Petite question sur les performances de Postgres ...
    Par cb44 dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 13/01/2004, 13h49

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