question sur les free ..

question sur les free .. - C - Programmation

Marsh Posté le 07-10-2005 à 14:33:58    

salut,
 
mettons que j'ai plusieurs types déja alloués, tel que  :
 

Code :
  1. double * toto;
  2. int * tata;
  3. structure_toute_chelou * bouli;


 
est ce que j'ai le droit de faire :
 

Code :
  1. toto  = (void*)tata = (void*)bouli = NULL;


 
aui lieu de :

Code :
  1. toto  = NULL;
  2. tata = NULL;
  3. bouli = NULL;


 
après avoir fait un free sur les différents bidules ?
 
merci par avance  :love:  :love:  :love:

Reply

Marsh Posté le 07-10-2005 à 14:33:58   

Reply

Marsh Posté le 07-10-2005 à 14:39:37    

me semble que oui
chez moi ca compile en tout cas
mais je vois pas trop l'intérêt


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 07-10-2005 à 15:19:39    

Bonjour,
 
Oui ca marche mais il vaut mieux considerer la 2nde solution comme bonne pour la lisibilite.  
La reduction du nombre de lignes de code n'a vraiment aucun interet en programmation.
 
@+

Reply

Marsh Posté le 07-10-2005 à 15:26:50    

Rickou a écrit :

Bonjour,
 
Oui ca marche mais il vaut mieux considerer la 2nde solution comme bonne pour la lisibilite.  
La reduction du nombre de lignes de code n'a vraiment aucun interet en programmation.
 
@+


 
+1
 
Voire, pour plus de lisibilité :
 

double *toto = NULL;
int    *tata = NULL;
structure_toute_chelou *bouli = NULL;


 
 
La lisibilité est extrêmement importante en programmation. Il suffit de revenir sur un programme qu'on a écrit soi-même trois mois plus tard pour s'en convaincre, on a du mal à s'y retrouver. Pour peu que ce soit dur à lire, c'est un calvaire. Et si c'est écrit par un autre, on préfèrerait se tirer une balle dans le pied que de décoder l'bazar.


Message édité par Elmoricq le 07-10-2005 à 15:28:36
Reply

Marsh Posté le 07-10-2005 à 15:31:14    

tu peux aussi te faire une macro zap pour faire le free + NULL

Reply

Marsh Posté le 07-10-2005 à 15:32:29    

Ah oui j'avais pas fait gaffe que c'était pour le free().
 
Ouaip, macro c'est sympa, ou mise à NULL sur la même ligne que le free(), les deux solutions permettant de ne pas dissocier ce qui est en fait une seule action.

Reply

Marsh Posté le 07-10-2005 à 16:29:32    

Taz a écrit :

tu peux aussi te faire une macro zap pour faire le free + NULL


 
ouais, alors autant la donner, parce que spontanement on va ecrire un truc genre ca :
 

Code :
  1. #define FREE(x) if (x) free(x); x = NULL;


 
 
alors que ca emmene plein d'emmerde
 

Code :
  1. #define FREE(x) {if (x) free(x); x = NULL;}


 
est d'ja un peu mieux
 

Reply

Marsh Posté le 07-10-2005 à 17:40:18    

mais perfectible. et pas qu'un peu
 

Code :
  1. #define FREE(X) do { if (X) free(X); (X) = NULL; } while (0)

Reply

Marsh Posté le 07-10-2005 à 17:45:48    

Si on va par là, on peut également dire qu'une macro de ce genre c'est mal parce qu'on évalue plusieurs fois son paramètre [:petrus75]
 
 
(et le if (x) est superflu)

Message cité 2 fois
Message édité par Elmoricq le 07-10-2005 à 17:46:24
Reply

Marsh Posté le 07-10-2005 à 17:47:55    

Elmoricq a écrit :

Si on va par là, on peut également dire qu'une macro de ce genre c'est mal parce qu'on évalue plusieurs fois son paramètre [:petrus75]


non, aucun rapport

Reply

Marsh Posté le 07-10-2005 à 17:47:55   

Reply

Marsh Posté le 07-10-2005 à 17:48:53    

FREE(++x) [:petrus75]

Message cité 1 fois
Message édité par Elmoricq le 07-10-2005 à 17:49:17
Reply

Marsh Posté le 07-10-2005 à 17:50:03    


fo deja en tenir une couche pour ecrire ca [:pingouino] ca merite la mort lapidation

Reply

Marsh Posté le 07-10-2005 à 17:52:11    

Elmoricq a écrit :

Si on va par là, on peut également dire qu'une macro de ce genre c'est mal parce qu'on évalue plusieurs fois son paramètre [:petrus75]
 
 
(et le if (x) est superflu)


oui c'est de la marne tout ça :)

Reply

Marsh Posté le 07-10-2005 à 17:54:45    

chrisbk a écrit :

fo deja en tenir une couche pour ecrire ca [:pingouino] ca merite la mort lapidation


 
Comme je le disais, si on commence à pinailler, on pinaille loin :o

Reply

Marsh Posté le 07-10-2005 à 18:19:16    

Taz a écrit :

mais perfectible. et pas qu'un peu
 

Code :
  1. #define FREE(X) do { if (X) free(X); (X) = NULL; } while (0)



 
merci pour vos réponses .. c'est quoi l'interet du do ..while ?
 
peut on faire :
 
#define NUKE(X) X ? free(X); (X) = NULL; :  ()
 
genre un truc comme as ?  :lol:  :jap:  :heink:  :sleep:  :sweat:  :sweat:  :sweat:  :sweat:

Reply

Marsh Posté le 07-10-2005 à 19:07:29    

in_your_phion a écrit :

#define NUKE(X) X ? free(X); (X) = NULL; :  ()


 
T'as essayé de compiler ton horreur pour voir ?  [:pingouino]

Reply

Marsh Posté le 07-10-2005 à 20:13:51    

in_your_phion a écrit :

merci pour vos réponses .. c'est quoi l'interet du do ..while ?


Ce do-while ne fait rien. Par contre, comme il manque un ';', il force l'utilisateur à le mettre. Ca rend le code plus cohérent.

Citation :

peut on faire :
#define NUKE(X) X ? free(X); (X) = NULL; :  ()


Après avoir fait le tour de la question, je fais comme ça :  

free (p), p = NULL;


ou éventuellement si on est bien réveillé :  

  FREE (p);


avec  

#define FREE(p) free(p), (p)=NULL


avec les précautions d'usage pour que la double évaluation ne pose pas de problèmes...


Message édité par Emmanuel Delahaye le 07-10-2005 à 20:17:32

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-10-2005 à 23:55:34    

Code :
  1. #define FREE(ptr) do { void **__ptr; __ptr = (void **)&ptr; free(*__ptr) ; *__ptr=NULL; } while (0)


[:cupra]


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 07-10-2005 à 23:56:38    

1/ pkoi les __ ? t'as le scope pour toi  
2/ pkoi tu passes en ** ?


Message édité par chrisbk le 07-10-2005 à 23:56:53
Reply

Marsh Posté le 08-10-2005 à 10:14:56    

t'as le scope pour toi, mais si t'es con comme moi le 1er truc que tu fais c'est utiliser ptr pour le ptr auxilliaire dans la macro, et utiliser ptr dans le code comme petit pointeur pour tester, et la ca merde :/
Le double c'est plur changer la valeur du pointeur à NULL en pointant sur lui ( en fait il est pas vraiment double, le 1er * c'est parceque tu pointe sur kkchose, et le second parceque le machin que tu pointe sur , c'est un pointeur, mais tu te sers jamais du ** )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 08-10-2005 à 11:03:47    

0x90 a écrit :

t'as le scope pour toi, mais si t'es con comme moi le 1er truc que tu fais c'est utiliser ptr pour le ptr auxilliaire dans la macro, et utiliser ptr dans le code comme petit pointeur pour tester, et la ca merde :/
Le double c'est plur changer la valeur du pointeur à NULL en pointant sur lui ( en fait il est pas vraiment double, le 1er * c'est parceque tu pointe sur kkchose, et le second parceque le machin que tu pointe sur , c'est un pointeur, mais tu te sers jamais du ** )


http://wbcl.free.fr/images/informatichien_frappadingue.gif


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-10-2005 à 11:19:01    


Et la version verbose ? :whistle:
 

Spoiler :


C'est cool comme ca prends à chaque fois que je poste du code soigneusement pourrifié ^^
( l'alloka fait main en C99 à coup de déclaration de tableau jvous l'avais montré ? [:cupra] )


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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