[C] Free...

Free... [C] - C - Programmation

Marsh Posté le 20-04-2004 à 22:11:21    

J'ai une erreur sur cette chose...
quelqu'un peut il m'en dire +?  
(compilé et exécuté sous VC++6)
 
void free_attribut(test)
attribut * test;
{
int i;
 
i=0;
 
free(test);

Reply

Marsh Posté le 20-04-2004 à 22:11:21   

Reply

Marsh Posté le 20-04-2004 à 22:15:13    

void free_attribut(attribut * test)  
{
}
 
c'est depassé les declaration de parametres comme ca

Reply

Marsh Posté le 20-04-2004 à 22:28:05    

c pas le plus dramatique..
lol

Reply

Marsh Posté le 20-04-2004 à 22:54:15    

tu le sort d'ou ce fameux code que tu recupere :d

Reply

Marsh Posté le 21-04-2004 à 01:00:17    

Ah mon avis c'est des sources de l'ansi ou d'un projet genre mpeg/jpeg...

Reply

Marsh Posté le 21-04-2004 à 05:09:41    

Ton code il montre pas ce qui est important : ce qu'il y a entre la création de l'attribut et l'appel à free_attribut. Si ça plante dans free(), c'est surement que tu passes un pointeur vers une zone qui a déja été libérée, ou qui n'a pas été allouée par malloc.


Message édité par matafan le 21-04-2004 à 05:10:24
Reply

Marsh Posté le 21-04-2004 à 12:36:55    

Je le sors d'une reprise d'un logiciel de ma boite...
 

Reply

Marsh Posté le 21-04-2004 à 12:38:50    

Déjà été libéré... ca se peut..  
Une question de novice..
si j'ai ca :  
toto *a; (toto est une structure)
a = malloc(..);
a->b=malloc(..);
....
dois je faire  
free (a->b);
free(a);
 
ou est ce que free (a) suffit??
Merci beaucoup

Reply

Marsh Posté le 21-04-2004 à 12:40:21    

non il faut les libérer les deux

Reply

Marsh Posté le 21-04-2004 à 12:45:17    

c bien ce qu'il me semblait...
L'ordre importe t il?
Merci!

Reply

Marsh Posté le 21-04-2004 à 12:45:17   

Reply

Marsh Posté le 21-04-2004 à 12:49:32    

L'ordre n'importe pas, mais par contre dès que tu as fait free(a) *tu ne dois plus* tenter d'accéder à a->b !
 
Donc l'ordre logique est celui que tu as montré, mais si tu as copié a->b quelque part d'autre (disons c) rien ne t'interdit de libérer d'abord a puis de libérer c.

Reply

Marsh Posté le 21-04-2004 à 13:01:02    

merci

Reply

Marsh Posté le 21-04-2004 à 20:04:56    

soit tes pointeurs pointent sur une zone allouée soit ils sont a NULL

Reply

Marsh Posté le 22-04-2004 à 07:16:01    

Bien sûr que si l'ordre est important. Si tu commences par libérer a, alors quand tu tentes de libérer a->b tu accède à une zone qui a déja été libérée. Si tu fais le free(a->b) juste après le free(a) alors tu as toutes les chances que ça passe quand même, mais c'est absolument incorrecte sur le principe, et si ça coredump c'est absolument normal.


Message édité par matafan le 22-04-2004 à 07:18:01
Reply

Marsh Posté le 22-04-2004 à 08:11:28    

De toutes les facons, les deux libérations doivent etre faites...si je résume bien tout ce que vous me dites...
C'est ce que je pensais..
 
Merci!

Reply

Marsh Posté le 22-04-2004 à 08:28:16    

djdie a écrit :

L'ordre n'importe pas, mais par contre dès que tu as fait free(a) *tu ne dois plus* tenter d'accéder à a->b !


donc l'ordre importe

Reply

Marsh Posté le 22-04-2004 à 09:58:51    

JagStang a écrit :

donc l'ordre importe

Ben mon post était clair il me semble. L'ordre de libération des deux zones mémoires n'importe pas du tout, pour autant que l'appel à free se fasse en donnant un pointeur valide, ce qui n'est pas le cas de a->b après libération de a.
 
Dire que l'ordre importe donne l'impression que les appels à free doivent obligatoirement être faits dans le sens inverses des appels à malloc, ce qui est faux.

Reply

Marsh Posté le 22-04-2004 à 11:34:58    

c'est ce que je dis oui

Reply

Sujets relatifs:

Leave a Replay

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