Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2478 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] destructeurs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] destructeurs

n°1138154
ffomnislas​h
Posté le 02-07-2005 à 17:28:36  profilanswer
 

:hello: hello
 
Je voudrais juste savoir si j'ai bien compris le fonctionnement des destructeurs ;)
 

Code :
  1. class A
  2. {
  3. private:
  4.   int* entier
  5. public
  6.    A();
  7.    ~A();
  8. class B
  9. {
  10. public:
  11.    int entier
  12.    char* chaine
  13.    A var;
  14. private:
  15.    B();
  16.    ~B();
  17. }


 
Si j'ai bien compris dans ~B() il y aura:
- une desalocation de tous les pointeurs du tableau chaine. (free)
- pas besoin de detruire l'entier car c'est fait automatiquement vu que ce n'est pas un pointeur
- la fonction ~A() sera appellé automatiquement, je n'ai pas besoin de le faire.
Ce qui donne:
~B()
{
   parcours de chaine
     free(chaine(i))
}
 
 
Alors j'ai bon?

mood
Publicité
Posté le 02-07-2005 à 17:28:36  profilanswer
 

n°1138158
KangOl
Profil : pointeur
Posté le 02-07-2005 à 17:36:39  profilanswer
 

non faut que tu revois comment fonctionne on désalloue un pointeur en c++...
 
utilise delete[]


---------------
Nos estans firs di nosse pitite patreye...
n°1138160
ffomnislas​h
Posté le 02-07-2005 à 17:37:48  profilanswer
 

oui c'est vrai que c'est delete en c++. C'etait juste un petite oublie :D
 
Mais sinon le reste c'est ok? les appelles automatiques ...

n°1138161
KangOl
Profil : pointeur
Posté le 02-07-2005 à 17:39:27  profilanswer
 

les appele auto, oui...
 
faut désalouer que les pointeurs...


---------------
Nos estans firs di nosse pitite patreye...
n°1138184
Taz
bisounours-codeur
Posté le 02-07-2005 à 18:19:55  profilanswer
 

utlise std::string

n°1138196
ffomnislas​h
Posté le 02-07-2005 à 18:28:26  profilanswer
 

j'utilise effectivement string, c'était juste un ex de tableau ;)
 
Ok j'ai donc bien compris le fonctionnement des destructeurs de classes ;) je vous remercie

n°1138198
KangOl
Profil : pointeur
Posté le 02-07-2005 à 18:28:40  profilanswer
 

c'est une autre technique
 
ou alors std::auto_ptr


---------------
Nos estans firs di nosse pitite patreye...
n°1138200
Taz
bisounours-codeur
Posté le 02-07-2005 à 18:30:33  profilanswer
 

non, pas std::auto_ptr<>. Ça serait d'ailleurs un désastrer avec les des classes A et B comme ça

n°1138208
KangOl
Profil : pointeur
Posté le 02-07-2005 à 18:34:11  profilanswer
 

mmmh ?


---------------
Nos estans firs di nosse pitite patreye...
n°1138211
Taz
bisounours-codeur
Posté le 02-07-2005 à 18:36:28  profilanswer
 

toi t'as jamais affecté 2 auto_ptr<> entre eux ...

mood
Publicité
Posté le 02-07-2005 à 18:36:28  profilanswer
 

n°1138215
KangOl
Profil : pointeur
Posté le 02-07-2005 à 18:39:23  profilanswer
 

non pas encore  :D


---------------
Nos estans firs di nosse pitite patreye...
n°1138220
Taz
bisounours-codeur
Posté le 02-07-2005 à 18:41:56  profilanswer
 

ben vas-y. Ensuite cours lire la doc
 

Spoiler :

les auto_ptr<> ont une sémantique de transfert de propriété. Pas de partage !

n°1145700
jesus_chri​st
votre nouveau dieu
Posté le 10-07-2005 à 20:25:55  profilanswer
 

Quand un objet est détruit, ça appelle automatiquement le destructeur de chaque membre ou classe héritée.
- Le destructeur d'un type scalaire (int, double) en vrai c'est rien.
- Le destructeur d'un pointeur xxx* c'est rien non plus, et non pas un appel à delete ou free. Il faut le faire soit même.
- Le destructeur d'un objet c'est... ben son vrai destructeur.
 
ex :
 

Code :
  1. class Bidule : public Machin
  2. {
  3.    int n;
  4.    int* p;
  5.    std::string s;
  6. public :
  7.    ~Bidule();
  8. };


 
Le destructeur ~Bidule() va :
- Ne rien faire sur n
- Ne rien faire sur p
- Appeller le destructeur de s
- Appeler ~Machin()

n°1145978
HelloWorld
Salut tout le monde!
Posté le 11-07-2005 à 09:44:51  profilanswer
 

Et puis en plus auto_ptr appelle delete, pas delete [].


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1146302
Ordre Noir
Posté le 11-07-2005 à 13:59:51  profilanswer
 

Très important : Les destructeurs doivent toujours toujours toujours être virtuels!


---------------
Film et musique experimentale? Viendez découvrir l'Ordre Noir !
n°1146319
Taz
bisounours-codeur
Posté le 11-07-2005 à 14:06:28  profilanswer
 

non.

n°1146322
Taz
bisounours-codeur
Posté le 11-07-2005 à 14:07:38  profilanswer
 
n°1147031
jesus_chri​st
votre nouveau dieu
Posté le 11-07-2005 à 20:25:23  profilanswer
 

Ordre Noir a écrit :

Très important : Les destructeurs doivent toujours toujours toujours être virtuels!


non, ça crée une v-table pour rien.
Si ta classe peut être utilisée à travers le système du polymorphise (pointeur/ref sur classe de base) là oui il faut qu'il soit virtuel.
 
Enfin, pour les débutants, une règle : si tu hésites, mets-le virtuel. C'est ce qui a le plus de chance de marcher.

n°1147329
++fab
victime du syndrome IH
Posté le 11-07-2005 à 23:47:52  profilanswer
 

:hello:  
 

jesus_christ a écrit :

Si ta classe peut être utilisée à travers le système du polymorphise (pointeur/ref sur classe de base) là oui il faut qu'il soit virtuel.


 
Pas seulement, voir l'alinéa 1 (qui suffit à mon sens) de lien posté par Taz :
 
In particular, here's when you need to make your destructor virtual:
    * if someone will derive from your class
 

Citation :

Enfin, pour les débutants, une règle : si tu hésites, mets-le virtuel. C'est ce qui a le plus de chance de marcher.


"en C++, ne paye pas pour ce que tu n'utilises pas"  [:adodonicoco]  

n°1147372
Taz
bisounours-codeur
Posté le 12-07-2005 à 01:33:08  profilanswer
 

je suis impressioné

n°1147470
Ordre Noir
Posté le 12-07-2005 à 10:01:05  profilanswer
 

Je ne suis pas expert C++, je mets donc toujours des destructeurs virtuels car c'est ainsi qu'on me l'a enseigné... Mais c'est vrai que les arguments présentés dans le lien de Taz sont tout à fait correct.
A vrai dire, je suis plus porté par le coté modélisation/réutilisabilité des objets plutôt que le coté technique et performances pures. Du coup, je peux creer des objets sans savoir par qui ils seront utilisés plus tard, notamment dans un travail en équipe.
Mais c'est vrai que le top consisterait à faire une analyse assez poussée afin de savoir quel destructeur doit être virtuel ou non.


Message édité par Ordre Noir le 12-07-2005 à 10:02:56

---------------
Film et musique experimentale? Viendez découvrir l'Ordre Noir !
n°1147488
HelloWorld
Salut tout le monde!
Posté le 12-07-2005 à 10:10:25  profilanswer
 

Quand on met un destructeur virtuel, ça sous entend que la classe que l'on écrit est destinée à être utilisée selon une sémantique de référence, qu'elle sera dérivée et manipulée via une interface de base. Bref, qu'elle est destinée à être détruite de manière polymorphique.
En ce sens rendre systématiquement le destructeur virtuel peut être une mauvaise pratique car tu ajoutes de la confusion dans l'interface de ta classe. Quelque part, ne jamais le mettre, ou le mettre systématiquement c'est la même démarche : je ne comprends pas / maitrise pas ce que je fais.
Comme règle, j'adopterai plutot celle proposée pour le prochain standard, à savoir de mettre un destructeur virtuel dans le cas de classes abstraites.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°1151181
ffomnislas​h
Posté le 16-07-2005 à 12:49:50  profilanswer
 

J'avais pas ensé a mettre mes destructeurs en virtuel  :ouch:  
 
Du moins pour les classe qui en ont besoin., j'y avais vraiment jamais pensé

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] destructeurs

 

Sujets relatifs
[résolu][poo/c++] héritage, constructeur et destructeurs[C++] Problème avec les destructeurs de class
Plus de sujets relatifs à : [C++] destructeurs


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)