[C++] destructeurs

destructeurs [C++] - C++ - Programmation

Marsh Posté le 02-07-2005 à 17:28:36    

: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?

Reply

Marsh Posté le 02-07-2005 à 17:28:36   

Reply

Marsh Posté le 02-07-2005 à 17:36:39    

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


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 02-07-2005 à 17:37:48    

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

Reply

Marsh Posté le 02-07-2005 à 17:39:27    

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


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 02-07-2005 à 18:19:55    

utlise std::string

Reply

Marsh Posté le 02-07-2005 à 18:28:26    

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

Reply

Marsh Posté le 02-07-2005 à 18:28:40    

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


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 02-07-2005 à 18:30:33    

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

Reply

Marsh Posté le 02-07-2005 à 18:34:11    

mmmh ?


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 02-07-2005 à 18:36:28    

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

Reply

Marsh Posté le 02-07-2005 à 18:36:28   

Reply

Marsh Posté le 02-07-2005 à 18:39:23    

non pas encore  :D


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 02-07-2005 à 18:41:56    

ben vas-y. Ensuite cours lire la doc
 

Spoiler :

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

Reply

Marsh Posté le 10-07-2005 à 20:25:55    

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()

Reply

Marsh Posté le 11-07-2005 à 09:44:51    

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 11-07-2005 à 13:59:51    

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


---------------
Film et musique experimentale? Viendez découvrir l'Ordre Noir !
Reply

Marsh Posté le 11-07-2005 à 14:06:28    

non.

Reply

Marsh Posté le 11-07-2005 à 14:07:38    

Reply

Marsh Posté le 11-07-2005 à 20:25:23    

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.

Reply

Marsh Posté le 11-07-2005 à 23:47:52    

: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]  

Reply

Marsh Posté le 12-07-2005 à 01:33:08    

je suis impressioné

Reply

Marsh Posté le 12-07-2005 à 10:01:05    

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 !
Reply

Marsh Posté le 12-07-2005 à 10:10:25    

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
Reply

Marsh Posté le 16-07-2005 à 12:49:50    

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é

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed