Free() veut pas désallouer....

Résolu
benlustr Messages postés 32 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 5 juillet 2006 - 9 juin 2006 à 09:43
benlustr Messages postés 32 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 5 juillet 2006 - 9 juin 2006 à 12:01
Bonjour à tous, c'est encore moi

Dans une fonction, j'ai deux pointeurs qui s'incrémentent dans une boucle. à la fin de la fonction, je libère les zones mémoires correspondantes que j'ai allouées avec malloc. Ensuite, je renvoie l'adresse qui correspond à l'une des zones mémoire. C'est au moment du return que j'ai un message du genre 'violation de l'adresse......'.
voici le code en gros :

float *p1, *p1_i, *p2;

p1 = (float*)malloc(512*512*sizeof(float));
p1_i = p1;

p2 = (float*)malloc(512*512*sizeof(float));

for(....)
{
p1++;
p2++;
}

free(p1);
free(p2);

return(p1_i); //Ici, il s'agit bien de l'adresse qui a été renvoyée à l'origine par malloc.

voilà, si vous avez une idée, je suis preneur. Merci à vous !

5 réponses

benlustr Messages postés 32 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 5 juillet 2006
9 juin 2006 à 12:01
Oui c'est ça,désormais, je fais un free sur le pointeur qui reçoit le résultat de cette fonction. ça marche impec
Merci bien
3
benlustr Messages postés 32 Date d'inscription lundi 10 avril 2006 Statut Membre Dernière intervention 5 juillet 2006
9 juin 2006 à 09:59
float *p1, *p1_i, *p1returned, *p2, p2_i;

p1 = (float*)malloc(512*512*sizeof(float));     //pointeur que je vais incrémentrer
p1_i = p1;                                                       //Ici, je conserve l'adresse d'origine, pour désallouer

p1returned = p1;                                             //Ici, je
garde l'adresse d'origine, celle que je vais retourner à la fin

p2 = (float*)malloc(512*512*sizeof(float));
p2_i = p2;

for(....)
{
p1_i++;
p2_i++;
}

free(p1);
free(p2);

return(p1_returned); //Ici, il s'agit bien de l'adresse qui a été renvoyée à l'origine par malloc.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
9 juin 2006 à 10:13
Normalement le free devrait désallouer...
Par contre, pourquoi retourner une valeur qui correspond à de la mémoire libérée?
0
cs_PoFMaN Messages postés 58 Date d'inscription dimanche 12 décembre 2004 Statut Membre Dernière intervention 21 juin 2006
9 juin 2006 à 10:57
Salut,

le message 'violation de l'adresse......' pour moi ne veu pas dire que free() n'a pas désalloué, au contraire. A mon avis tu as cette erreur parce que tu essaye de retourner une adresse mémoire qui a été libérée (ca m'étonnerai mais j'ai jamais essayé), ou parce que tu essaye de faire quelque chose avec cette adresse une fois que tu l'as retournée.

Et moi non plus je vois pas à quoi ca sert de retourner une adresse mémoire qui a été libérée.

Et au passage je vois pas non plus lma différence entre p1 et p1_returned (a part le nom :) )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
9 juin 2006 à 11:05
Une fois sortie de ta fonction, ton pointeur ne vaut plus rien.
 Pas étonnant que ton soft plante si tu essayes de travailler sur cette adresse retournée!

Shell
0
Rejoignez-nous