Une petite question sur delete...

Une petite question sur delete... - C++ - Programmation

Marsh Posté le 26-05-2003 à 21:30:35    

Salut,
 
alors voilà mon problème:
 
à un moment dans l'exécution de mon programme je fais un new MaClasse.
 
Quand je fais delete MaClasse, elle est effectivement bien supprimée, mais si je fais:
 

Code :
  1. if (MaClasse)
  2.   ShowMessage("ok" );


 
Il m'affiche quand même "ok", alors qu'elle est supprimée...
 
C'est normal?


---------------
Another .Net Blog
Reply

Marsh Posté le 26-05-2003 à 21:30:35   

Reply

Marsh Posté le 26-05-2003 à 21:32:11    

Oui, le delete ne met pas à 0 ton pointeur (je suppose que MaClasse est un pointeur sinon ça n'a pas de sens). Cependant, il ne faut pas essayer d'accéder à des membres.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 26-05-2003 à 21:32:27    

haazheel a écrit :

C'est normal?


 
oui


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 26-05-2003 à 21:41:20    

gatorette a écrit :

Oui, le delete ne met pas à 0 ton pointeur (je suppose que MaClasse est un pointeur sinon ça n'a pas de sens). Cependant, il ne faut pas essayer d'accéder à des membres.


 
Accéder à des membres? Qu'est-ce que tu veux dire par là?
 
Et donc pour vraiment initialiser, il faut que je mette mon pointeur à NULL?


---------------
Another .Net Blog
Reply

Marsh Posté le 26-05-2003 à 21:58:35    

juste un petit test:
 

Code :
  1. delete MaClasse;
  2. MaClasse = NULL;


 
A l'air de fonctionner


---------------
Another .Net Blog
Reply

Marsh Posté le 26-05-2003 à 22:07:05    

haazheel a écrit :


Accéder à des membres? Qu'est-ce que tu veux dire par là?


 
Je veux dire que si tu fais :

Code :
  1. delete monPointeur;
  2. monPointeur->maFonction();
  3. monPointeur->maVariable;


tu risques d'avoir des problèmes.
 

haazheel a écrit :


Et donc pour vraiment initialiser, il faut que je mette mon pointeur à NULL?


Tu n'initalises rien en mettant ton pointeur à NULL. NULL est juste une valeur repère. Je crois que quand un pointeur est NULL, tu peut être sûr qu'il ne pointes pas vers un objet. C'est une pratique courante de mettre un pointeur à NULL avant de créer l'objet associé et de le remettre à NULL (comme tu l'a écrit) après l'avoir effacé.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 26-05-2003 à 22:29:34    

gatorette a écrit :


 
Je veux dire que si tu fais :

Code :
  1. delete monPointeur;
  2. monPointeur->maFonction();
  3. monPointeur->maVariable;


tu risques d'avoir des problèmes.


 
Effectivement, je suis bien conscient que si je fais un delete de ma classe, c'est pas pour tenter de l'utiliser après :)  
 

gatorette a écrit :


Tu n'initalises rien en mettant ton pointeur à NULL. NULL est juste une valeur repère. Je crois que quand un pointeur est NULL, tu peut être sûr qu'il ne pointes pas vers un objet. C'est une pratique courante de mettre un pointeur à NULL avant de créer l'objet associé et de le remettre à NULL (comme tu l'a écrit) après l'avoir effacé.


Donc j'ai bien fait...
 
Et en plus ça fonctionne... :sol:


---------------
Another .Net Blog
Reply

Marsh Posté le 27-05-2003 à 01:44:39    

NULL qui est canoniquement égal à 0 selon la norme ISO

Reply

Marsh Posté le 27-05-2003 à 08:41:48    

++Taz a ?it :

NULL qui est canoniquement ?l ? selon la norme ISO


 
arf... là n'été pas la question...

Reply

Marsh Posté le 18-08-2004 à 11:52:30    

Dans le cas où on fait un "delete MaClasse", sans "MaClasse = NULL" ensuite, y a-t-il un risque de fuite de mémoire ?
Et est-ce que faire "MaClasse = NULL" suffit pour eviter un risque de fuite ?
 
A vrai dire, j'ai un cas où je fais un "delete" mais sur le debuggeur, j'ai l'impression que ce "delete" ne fait rien !! Tous les membres de l'instance de cette classe ne sont pas "effacés".
Si je fais : "MaClasse = 0" ensuite, ca semble bon.

Reply

Marsh Posté le 18-08-2004 à 11:52:30   

Reply

Marsh Posté le 18-08-2004 à 13:16:23    

xyz75 a écrit :

Dans le cas où on fait un "delete MaClasse", sans "MaClasse = NULL" ensuite, y a-t-il un risque de fuite de mémoire ?
Et est-ce que faire "MaClasse = NULL" suffit pour eviter un risque de fuite ?


 
pas une fuite, mais un pointeur fou.
delete n'efface rien, ça indique juste au gestionnaire de mémoire que la place occupée est maintenant libre. Le contenu ne change pas.
C'est comme quand tu efface un fichier, il n'est plus indexé mais son contenu est tjrs présent physiquement sur le disque jusqu'à écrasement

Reply

Marsh Posté le 19-08-2004 à 01:10:58    

Et la question à 100 boules pour Taz : pourquoi est-ce que le comité C++ n'a pas choisi de forcer un pointeur à 0 quand on le delete ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 19-08-2004 à 01:23:28    

parce que tu fais comment quand l'argument de delete n'est une  l-value ?

Reply

Marsh Posté le 19-08-2004 à 20:38:20    

tu aurais un exemple stp ? (ou justement ce n'est pas une l-value)

Reply

Marsh Posté le 19-08-2004 à 21:09:57    

cris56 a écrit :

tu aurais un exemple stp ? (ou justement ce n'est pas une l-value)


 

Code :
  1. const MaClass * const pointer_pas_affectable;


 
PS : je sais qu'il y a un const en trop ;)

Reply

Marsh Posté le 19-08-2004 à 21:16:05    

a ouai ok, merci

Reply

Marsh Posté le 19-08-2004 à 22:46:26    

Je n'ai pas compris cet exemple. Dans quel cas apparait-il en pratique ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 19-08-2004 à 23:02:58    

el muchacho a écrit :

Je n'ai pas compris cet exemple. Dans quel cas apparait-il en pratique ?


 
chez ilog [:spamafote]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 20-08-2004 à 18:45:43    

Ce sont des classes statiques, non ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 20-08-2004 à 19:48:54    

el muchacho a écrit :

Je n'ai pas compris cet exemple. Dans quel cas apparait-il en pratique ?

je pensais plus simplement à un retour de fonction
 
delete get_pointer();

Reply

Sujets relatifs:

Leave a Replay

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