[C++] Problème avec les destructeurs de class

Problème avec les destructeurs de class [C++] - Programmation

Marsh Posté le 22-06-2001 à 18:52:09    

Comment qu'on utilise le destructeur d'une class une fois que n'en a plus besoin?
 
Je sais qu'il faut mettre ça: ~CNomDeLaClass(); en public, mais comment qu'on l'appel réellement une fois dans le programme?

Reply

Marsh Posté le 22-06-2001 à 18:52:09   

Reply

Marsh Posté le 22-06-2001 à 18:55:30    

Le destructeur n'est généralement pas appelé explicitement. Il est appelé quand l'élément sort de la portée courante:
 
ex
 
while(truc)
{
 Maclasse c;   //ctr par défaut appelé
....
} //en sortant c est détruit par un appel à son destructeur
 
va voir mon site, y'a une section sur les destructeurs.


---------------
-----------------------
Reply

Marsh Posté le 22-06-2001 à 18:58:33    

Ah oui, si t'as une classe qui contient des données en grande quantité et que tu ne veux plus de ces données, tu peux vider la classe (par ex, si c'est une bitmap, faire image.redim(0,0)); et donc libérer la mémoire.
En général, détruire un objet alors qu'il est encore accessible est un hérésie, car le but même du couple constructeur/destructeur est de s'assurer qu'un objet accessible est utilisable, en bon état!


---------------
-----------------------
Reply

Marsh Posté le 22-06-2001 à 19:05:02    

J'avais pigé ce qui est sur ton site, je voudrais juste savoir comment on écrit la syntaxe pour utiliser ce destructeur dans le main() par exemple.
 
J'ai essayé ça:
 
CClass Test;
~Test();
 
Mais ça marche pas. Faut mettre quoi?

Reply

Marsh Posté le 22-06-2001 à 19:12:49    

~Test()
ça fait Test.operator()().operator ~();
 
il faut faire
 
Test.~CClass();
 
je vais le rajouter sur le site...


---------------
-----------------------
Reply

Marsh Posté le 22-06-2001 à 19:19:51    

Thanks ça marche impec.
:)

Reply

Marsh Posté le 22-06-2001 à 19:57:32    

Pour les pointeurs, ce qui suit marche pour la destruction de l'objet:
 
Truc * montruc;  //sans aucune allusion
....
delete montruc;

Reply

Marsh Posté le 22-06-2001 à 20:02:49    

Quels sont les cas où il est intéressant d'appeler directement le destructeur ?

Reply

Marsh Posté le 22-06-2001 à 20:04:27    

Quand on a un gros objet qui prend de la place memoire, et qu'on a besoin de memoire tout de suite, et qu'on ne peut pas attendre la fin du bloc ??

Reply

Marsh Posté le 22-06-2001 à 20:11:11    

ben no tgrx, c'est pas beau un objet qui n'est plus en état stable (non initialisé)
 
Un bon exemple de cas utile c'est la classe d'allocateur utilisée par la STL. Elle implémente les alloc/desalloc genre new/delete, et pour ça il faut appeler le destructeur, parce que delete, ce n'est que appel au destructeur + free.


---------------
-----------------------
Reply

Marsh Posté le 22-06-2001 à 20:11:11   

Reply

Marsh Posté le 22-06-2001 à 20:30:20    

En effet:
icare:/usr/include/g++-3$ grep "\->\~" *.h
stl_alloc.h:  void destroy(pointer __p) { __p->~_Tp(); }
stl_alloc.h:  void destroy(pointer __p) { __p->~_Tp(); }
stl_construct.h:  __pointer->~_Tp();

Reply

Sujets relatifs:

Leave a Replay

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