Free... [C] - C - Programmation
Marsh Posté le 20-04-2004 à 22:15:13
void free_attribut(attribut * test)
{
}
c'est depassé les declaration de parametres comme ca
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...
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.
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
Marsh Posté le 21-04-2004 à 12:45:17
c bien ce qu'il me semblait...
L'ordre importe t il?
Merci!
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.
Marsh Posté le 21-04-2004 à 20:04:56
soit tes pointeurs pointent sur une zone allouée soit ils sont a NULL
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.
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!
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
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.
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);