Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#26 Le 18/08/2008, à 14:38

nicolas66

Re : probleme de "free" progammation C

Tiens justement, je viens de rédiger la page de Valgrind dans la doc smile


"The computer was born to solve problems that did not exist before." (B. Gates)

Hors ligne

#27 Le 18/08/2008, à 14:51

klubbin

Re : probleme de "free" progammation C

Voici ce que j'obtient sur mon code C de base ( non celui qu'on m'a proposer) sur la focntion clearListFaits:


==7655== 
==7655== Invalid read of size 4
==7655==    at 0x8049A17: clearListeFaits (Base_fait.c:169)
==7655==    by 0x8049A45: clearListeFaits (Base_fait.c:179)
==7655==    by 0x8048EAA: menu (Main.c:175)
==7655==    by 0x8049547: main (Main.c:413)
==7655==  Address 0x417A178 is 200 bytes inside a block of size 204 free'd
==7655==    at 0x402123A: free (vg_replace_malloc.c:233)
==7655==    by 0x8049A2E: clearListeFaits (Base_fait.c:175)
==7655==    by 0x8048EAA: menu (Main.c:175)
==7655==    by 0x8049547: main (Main.c:413)

Comment interpreter cela?

Merci vraiment de votre aide

#28 Le 18/08/2008, à 14:57

klubbin

Re : probleme de "free" progammation C

//ligne166              void clearListeFaits(ST_FAIT **liste_des_faits)
//ligne167  {
	ST_FAIT *supp=NULL;
	supp=*liste_des_faits;
	
	if (supp==NULL)	
		return ;
//ligne173  	else	
	{
		free(*liste_des_faits);
		liste_des_faits=NULL;
		
	}
	return clearListeFaits(&supp->suiv);	
//ligne180  }

#29 Le 18/08/2008, à 14:57

klubbin

Re : probleme de "free" progammation C

//ligne166              void clearListeFaits(ST_FAIT **liste_des_faits)
//ligne167  {
	ST_FAIT *supp=NULL;
	supp=*liste_des_faits;
	
	if (supp==NULL)	
		return ;
//ligne173  	else	
	{
		free(*liste_des_faits);
		liste_des_faits=NULL;
		
	}
	return clearListeFaits(&supp->suiv);	
//ligne180  }

#30 Le 18/08/2008, à 14:59

klubbin

Re : probleme de "free" progammation C

//ligne166              void clearListeFaits(ST_FAIT **liste_des_faits)
//ligne167                        {
	                                   ST_FAIT *supp=NULL;
	                                   supp=*liste_des_faits;
	
	                                    if (supp==NULL)	
	                                	return ;
//ligne173                        	else	
	                                    {
		                             free(*liste_des_faits);
		                             liste_des_faits=NULL;
		
	                                    }
	                                    return clearListeFaits(&supp->suiv);	
//ligne180                            }

#31 Le 20/08/2008, à 00:51

thy

Re : probleme de "free" progammation C

klubbin a écrit :

Voici ce que j'obtient sur mon code C de base ( non celui qu'on m'a proposer) sur la focntion clearListFaits:

==7655== 
==7655== Invalid read of size 4
==7655==    at 0x8049A17: clearListeFaits (Base_fait.c:169)
==7655==    by 0x8049A45: clearListeFaits (Base_fait.c:179)
==7655==    by 0x8048EAA: menu (Main.c:175)
==7655==    by 0x8049547: main (Main.c:413)
==7655==  Address 0x417A178 is 200 bytes inside a block of size 204 free'd
==7655==    at 0x402123A: free (vg_replace_malloc.c:233)
==7655==    by 0x8049A2E: clearListeFaits (Base_fait.c:175)
==7655==    by 0x8048EAA: menu (Main.c:175)
==7655==    by 0x8049547: main (Main.c:413)

Comment interpreter cela?

Merci vraiment de votre aide

Cela signifie que tu lis une zone mémoire qui a été libéré,
et effectivement ton appel récursif lit un pointeur libéré.
En l'occurrence le pointeur supp.

Mais une solution plus propre a déjà été proposé dans les premiers posts

Dernière modification par thy (Le 20/08/2008, à 00:52)

Hors ligne

#32 Le 25/08/2008, à 14:40

klubbin

Re : probleme de "free" progammation C

thy a écrit :
klubbin a écrit :

Voici ce que j'obtient sur mon code C de base ( non celui qu'on m'a proposer) sur la focntion clearListFaits:

==7655== 
==7655== Invalid read of size 4
==7655==    at 0x8049A17: clearListeFaits (Base_fait.c:169)
==7655==    by 0x8049A45: clearListeFaits (Base_fait.c:179)
==7655==    by 0x8048EAA: menu (Main.c:175)
==7655==    by 0x8049547: main (Main.c:413)
==7655==  Address 0x417A178 is 200 bytes inside a block of size 204 free'd
==7655==    at 0x402123A: free (vg_replace_malloc.c:233)
==7655==    by 0x8049A2E: clearListeFaits (Base_fait.c:175)
==7655==    by 0x8048EAA: menu (Main.c:175)
==7655==    by 0x8049547: main (Main.c:413)

Comment interpreter cela?

Merci vraiment de votre aide

Cela signifie que tu lis une zone mémoire qui a été libéré,
et effectivement ton appel récursif lit un pointeur libéré.
En l'occurrence le pointeur supp.

Mais une solution plus propre a déjà été proposé dans les premiers posts

AU niveau de la solution proposée je suis d'accord que s'est plus propore et tout.
Mais le probleme est que j'utilisait cette fonction dans d'autre programme sans changer une seule ligne de code et tout fonctionnait trés bien...
De plus j'obtient une erreur comme celle ci a chque utilisaton du free dans mon programme et pas forcement que dans la fonction que je vous est montrer.
Ne serait ce plutot pas un probleme venant du hard par ex?
Merkiiiiii

#33 Le 04/09/2008, à 13:16

thy

Re : probleme de "free" progammation C

je ne pense pas que ce soit un problème matériel.
Mais si on veux être sur que ce n'est pas ton code qui marche mal, il faudrait que tu nous montre un code simple qui provoque la même erreur.
Par exemple un main qui alloue une chaîne de caractères puis la libéré.
Ça serait bien que tu recompile ton prog avec les symboles de debugage en rajoutant l'option -g aux flags de compile, et que tu redonne ensuite la première erreur que tu avais posté.

Dernière modification par thy (Le 04/09/2008, à 13:46)

Hors ligne