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.

#1 Le 31/07/2008, à 17:48

klubbin

probleme de "free" progammation C

Bonsoir,

Voila je suis actuellement sur de la programmation en C.
J'utilise la fonction free et a chaque fois que je m'en sert j'obtient cette erreur

*** glibc detected *** ./Main: free(): invalid pointer: 0x0804d174 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7e857cd]
/lib/tls/i686/cmov/libc.so.6(cfree+0x90)[0xb7e88e30]
./Main[0x804a4da]
./Main[0x804a5b9]
./Main[0x80494ad]
./Main[0x80495ed]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7e33ebc]
./Main[0x80488e1]
======= Memory map: ========
08048000-0804c000 r-xp 00000000 08:03 459436     /home/klubbin/Desktop/Projet_IA/bin/Main
0804c000-0804d000 rw-p 00003000 08:03 459436     /home/klubbin/Desktop/Projet_IA/bin/Main
0804d000-0806e000 rw-p 0804d000 00:00 0          [heap]
b7d00000-b7d21000 rw-p b7d00000 00:00 0 
b7d21000-b7e00000 ---p b7d21000 00:00 0 
b7e05000-b7e10000 r-xp 00000000 08:03 278592     /lib/libgcc_s.so.1
b7e10000-b7e11000 rw-p 0000a000 08:03 278592     /lib/libgcc_s.so.1
b7e1d000-b7e1e000 rw-p b7e1d000 00:00 0 
b7e1e000-b7f59000 r-xp 00000000 08:03 281828     /lib/tls/i686/cmov/libc-2.5.so
b7f59000-b7f5a000 r--p 0013b000 08:03 281828     /lib/tls/i686/cmov/libc-2.5.so
b7f5a000-b7f5c000 rw-p 0013c000 08:03 281828     /lib/tls/i686/cmov/libc-2.5.so
b7f5c000-b7f5f000 rw-p b7f5c000 00:00 0 
b7f68000-b7f6d000 rw-p b7f68000 00:00 0 
b7f6d000-b7f86000 r-xp 00000000 08:03 278549     /lib/ld-2.5.so
b7f86000-b7f88000 rw-p 00019000 08:03 278549     /lib/ld-2.5.so
bfa52000-bfa67000 rw-p bfa52000 00:00 0          [stack]
ffffe000-fffff000 r-xp 00000000 00:00 0          [vdso]
Abandon (core dumped)

Est ce que quelqu'un peu m'aider

Je vous remercie de votre aide!!!

#2 Le 31/07/2008, à 18:02

slasher_fun

Re : probleme de "free" progammation C

Cette erreur signifie que tu tentes de libérer une zone mémoire qui n'appartient pas à ton programme smile

Hors ligne

#3 Le 31/07/2008, à 18:23

nicolas.sitbon

Re : probleme de "free" progammation C

Sans voir le code, impossible de t'aider.

Hors ligne

#4 Le 31/07/2008, à 20:17

klubbin

Re : probleme de "free" progammation C

nicolas.sitbon a écrit :

Sans voir le code, impossible de t'aider.

Le voici:

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

je te remercie de ton aide

#5 Le 31/07/2008, à 20:18

klubbin

Re : probleme de "free" progammation C

slasher-fun a écrit :

Cette erreur signifie que tu tentes de libérer une zone mémoire qui n'appartient pas à ton programme smile

bein pourtant comme tu peu le voir lafonction utilisant ce free est bien presente dans mon programe...bizarre..

#6 Le 31/07/2008, à 20:28

loloof64

Re : probleme de "free" progammation C

Bonjour smile

klubbin->
(Je suis encore un débutant en C/C++) : je pense qu'il aurait été bon de préciser :
-> la composition de la struct ST_FAIT
-> le code qui a crée le tableau à deux dimensions de ST_FAIT que tu passes à la fonction clearListeFaits (je déduis de ta démarche qu'il existe une fonction du genre makeListeFaits) .

Pouquoi ? Ta fonction est récursive, et l'ordre des appels semble ici très déterminant .

Dernière modification par loloof64 (Le 31/07/2008, à 20:30)

Hors ligne

#7 Le 31/07/2008, à 20:35

nicolas.sitbon

Re : probleme de "free" progammation C

Le problème est que tu ne montres pas le code appelant ni même l'allocation, donc impossible de se prononcer.
En revanche je vois déjà une grosse erreur :
Dans le cas ou supp n'est pas NULL, tu le free() et ensuite tu tentes de le déréférencer.

return clearListeFaits(&supp->suiv);

comportement indéterminé.
Voici un code plus propre :

void clearListeFaits (ST_FAIT **liste_des_faits)
{
   if (liste_des_faits != NULL)
   {
      ST_FAIT *current = *liste_des_faits;

      if (current != NULL)
      {
         ST_FAIT *supp = current->suiv;
         free (current), current = *liste_des_faits = NULL;
         clearListeFaits (&supp);
      }
   }
}

néanmoins je ne suis pas fan des fonctions récursives.

Dernière modification par nicolas.sitbon (Le 16/08/2008, à 22:12)

Hors ligne

#8 Le 31/07/2008, à 20:36

klubbin

Re : probleme de "free" progammation C

loloof64 a écrit :

Bonjour smile

klubbin->
(Je suis encore un débutant en C/C++) : je pense qu'il aurait été bon de préciser :
-> la composition de la struct ST_FAIT
-> le code qui a crée le tableau à deux dimensions de ST_FAIT que tu passes à la fonction clearListeFaits (je déduis de ta démarche qu'il existe une fonction du genre makeListeFaits) .

Pouquoi ? Ta fonction est récursive, et l'ordre des appels semble ici très déterminant .

voila pour la structure

typedef struct fait
{
	char s_id[100];
	char s_texte[100];
	struct fait *suiv;
}
ST_FAIT;

et voici comment la liste chainée est crée

T_FAIT* creerFait(ST_FAIT* fait)
{

	fait = (ST_FAIT *)malloc(sizeof(ST_FAIT));
	if (fait != NULL)
	{
		fprintf(stdout,"\nPlease enter the descriptive id of the fact: ");
		getchar();	//permet d'absorber le caracter \n de validation
		fgets(fait->s_id,4096,stdin);	//permet de lire un ligne (4096 octets)
		search(fait->s_id);
		strcpy(fait->s_id,MyTolower(fait->s_id));
		fprintf(stdout,"Please enter the corresponding text: ");
		fgets(fait->s_texte,4096,stdin);//permet de lire un ligne (4096 octets)
		search(fait->s_texte);
		strcpy(fait->s_texte,MyTolower(fait->s_texte));
		fait->suiv=NULL;
	}
	return(fait);
}


// Cette fonction permet de copier un nouveau fait � la suite
// dans la liste chainee des faits
int rajouterFait(ST_FAIT* fait,ST_FAIT **liste_des_faits)
{
	int i_retour=1,
	    i_existe = 0;
	ST_FAIT *parcours_liste=NULL;

	if (*liste_des_faits == NULL) // la liste etait donc vide
	{
		*liste_des_faits = fait;

		// La creation du nouveau fait a t elle echouee ?
		if (*liste_des_faits == NULL) i_retour = -1;
		return (i_retour);
	}
	else
	{
		parcours_liste=*liste_des_faits;
		if (strcmp(parcours_liste->s_id,fait->s_id)==0) i_existe = 1;

		while( (parcours_liste->suiv != NULL) && (i_existe == 0) )
		{
			parcours_liste = parcours_liste->suiv;
			if (strcmp(parcours_liste->s_id,fait->s_id)==0) i_existe = 1;
		}


		// Si le fait n'existe pas dans la liste alors on l'ajoute
		if ( i_existe == 0)
		{
			fait->suiv=*liste_des_faits;
			*liste_des_faits=fait;
		}
	}

	return(i_retour);
}

je te remercie

#9 Le 31/07/2008, à 20:37

nicolas.sitbon

Re : probleme de "free" progammation C

loloof64 a écrit :

(Je suis encore un débutant en C/C++) : je pense qu'il aurait été bon de préciser :
-> le code qui a crée le tableau à deux dimensions de ST_FAIT que tu passes à la fonction clearListeFaits (je déduis de ta démarche qu'il existe une fonction du genre makeListeFaits) .

Je ne crois pas qu'il s'agisse d'un tableau à 2 dimensions mais plutôt d'une liste chainée.

Hors ligne

#10 Le 31/07/2008, à 20:39

loloof64

Re : probleme de "free" progammation C

nicolas.sitbon a écrit :
loloof64 a écrit :

(Je suis encore un débutant en C/C++) : je pense qu'il aurait été bon de préciser :
-> le code qui a crée le tableau à deux dimensions de ST_FAIT que tu passes à la fonction clearListeFaits (je déduis de ta démarche qu'il existe une fonction du genre makeListeFaits) .

Je ne crois pas qu'il s'agisse d'un tableau à 2 dimensions mais plutôt d'une liste chainée.

Oups : milles excuses pour la dénomination tableau neutral

Je vais être honnête : je n'ai pas compris grand chose au code .
(Je n'ai jamais programmé de liste chainée .)

Dernière modification par loloof64 (Le 31/07/2008, à 20:45)

Hors ligne

#11 Le 31/07/2008, à 20:57

nicolas.sitbon

Re : probleme de "free" progammation C

Encore une fois sans tout le code difficile de comprendre la logique :

ST_FAIT* creerFait (void)
{
   ST_FAIT *fait = malloc (sizeof *fait);
   
   if (fait != NULL)
   {
      printf ("\nPlease enter the descriptive id of the fact: ");
      fflush (stdout);
      getchar ();    //permet d'absorber le caracter \n de validation
      fgets (fait->s_id, sizeof fait->s_id, stdin);
      search (fait->s_id);
      
      /*
       * strcpy(fait->s_id,MyTolower(fait->s_id));
       * impossible si la chaine est modifiée sur place
       */
      printf ("Please enter the corresponding text: ");
      fflush (stdout);
      fgets (fait->s_texte, sizeof fait->s_texte, stdin);
      search (fait->s_texte);
      
      /*
       * strcpy(fait->s_texte,MyTolower(fait->s_texte));
       * impossible si la chaine est modifiée sur place
       */
      fait->suiv = NULL;
   }
   return fait;
}


// Cette fonction permet de copier un nouveau fait � la suite
// dans la liste chainee des faits
int rajouterFait (ST_FAIT* fait, ST_FAIT **liste_des_faits)
{
   int i_retour = 1;

   if (liste_des_faits != NULL) 
   {
      ST_FAIT *current = *liste_des_faits;
      if (current == NULL)// la liste etait donc vide
      {
         current = fait;

         // La creation du nouveau fait a t elle echouee ?
         if (current == NULL)
            i_retour = -1;
      }
      else
      {
         bool i_existe = false;

         for (ST_FAIT *parcours_liste = current;
              i_existe == false && parcours_liste != NULL;
              parcours_liste = parcours_liste->suiv)
         {
            if (strcmp (parcours_liste->s_id, fait->s_id) == 0)
               i_existe = true;
         }

         // Si le fait n'existe pas dans la liste alors on l'ajoute
         if (i_existe == false)
         {
            if (fait != NULL)
            {
               fait->suiv = *liste_des_faits;
               *liste_des_faits = fait;
            }
         }
      }
   }

   return i_retour;
}

Hors ligne

#12 Le 31/07/2008, à 20:59

klubbin

Re : probleme de "free" progammation C

le probleme est que je travail avec un makefile donc tout mon code est éclaté

#13 Le 31/07/2008, à 21:17

nicolas66

Re : probleme de "free" progammation C

néanmoins je ne suis pas fan des fonctions récursives.

Dans certaines situations, difficile de trouver un algo séquentiel équivalent ...


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

Hors ligne

#14 Le 13/08/2008, à 13:25

klubbin

Re : probleme de "free" progammation C

Up!!

Bonjour,

je me permet de faire un up pour savoir si quelqu'un a une idée a mon probleme ou s'il faut que je post une autre partie de mon code car mon problème n'est toujours pas résolu.

Je vous remercie!!

#15 Le 13/08/2008, à 14:07

nicolas.sitbon

Re : probleme de "free" progammation C

Soit tu postes un code qui compile et qui permette de reproduire le problème, soit tu continues à perdre ton temps sur ce forum : au choix!

Hors ligne

#16 Le 13/08/2008, à 14:33

thy

Re : probleme de "free" progammation C

@nicolas.sitbon : je reprends ta version qui contient une petite erreur

void clearListeFaits (ST_FAIT **liste_des_faits)
{
   if (liste_des_faits != NULL)
   {
      ST_FAIT *current = *liste_des_faits;

      if (current != NULL)
      {
         // current est un (ST_FAIT *) donc pas de &
         ST_FAIT *supp = current->suiv; 
         free (current);
         current = liste_des_faits = NULL;
         clearListeFaits (&supp);
      }
   }
}

Hors ligne

#17 Le 13/08/2008, à 15:04

klubbin

Re : probleme de "free" progammation C

nicolas.sitbon a écrit :

Soit tu postes un code qui compile et qui permette de reproduire le problème, soit tu continues à perdre ton temps sur ce forum : au choix!

Re merci mais excuse moi je ne comprend ppas de quel code tu parle?
Celui qui cause le probleme?
Bein j'ai ce probleme a chaque fois que j'utilise la fonction free et ceci dans des fichiers séparés.
Quel code doisje poster?

Merkiiii

#18 Le 13/08/2008, à 15:57

nicolas.sitbon

Re : probleme de "free" progammation C

Tu dois poster un code compilable et qui reproduise l'erreur!!!

Hors ligne

#19 Le 16/08/2008, à 14:35

claudius01

Re : probleme de "free" progammation C

Bonjour,

Avec le code qui est présenté, il est clair que l'utilisation de 'free(<pointeur>)' ne doit être exécuté que si <pointeur> a été retourné par un 'alloc()' (ou un 'malloc()').
La ligne ST_FAIT *current = *liste_des_faits; est une allocation sur la stack (current disparaît et est libéré à la sortie de la procédure) et non sur le tas qui serait :
ST_FAIT *current = (ST_FAIT *)malloc...
permettant un :
free(current);

CQFD


Cordialement, A+
--
Claudius

Hors ligne

#20 Le 16/08/2008, à 20:57

thy

Re : probleme de "free" progammation C

claudius01 a écrit :

Avec le code qui est présenté, il est clair que l'utilisation de 'free(<pointeur>)' ne doit être exécuté que si <pointeur> a été retourné par un 'alloc()' (ou un 'malloc()').

oui

claudius01 a écrit :

La ligne ST_FAIT *current = *liste_des_faits; est une allocation sur la stack (current disparaît et est libéré à la sortie de la procédure)

le pointeur current est alloué sur la pile, mais il prend la
valeur (l'adresse) d'une zone memoire allouée sur le tas, en l'occurence
*liste_des_faits

Donc free(current) ne pose pas de problème dans ce cas

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

Hors ligne

#21 Le 16/08/2008, à 21:13

rniamo

Re : probleme de "free" progammation C

je ne pense pas que ça vienne de là mais pourquoi :

liste_des_faits = NULL;

< Quelques un des mes programmes  | Cuisine Facile (pour les gourmands) | Fast MVC for PHP >
        \   ^__^
         \  (o o)\_______
            (___)\            )\

Hors ligne

#22 Le 16/08/2008, à 22:59

Watchwolf

Re : probleme de "free" progammation C

utilise valgrind.

Hors ligne

#23 Le 17/08/2008, à 00:48

tiky

Re : probleme de "free" progammation C

+1 pour valgrind sinon vérifie que tu ne libères pas deux fois la mémoire à la même adresse.


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne

#24 Le 18/08/2008, à 14:09

klubbin

Re : probleme de "free" progammation C

Bonjour et merci pour vos réponse.

Une petite precision: L'erreur que je vous est indiqué au début n'apparait que sur mon PC...
J'ai tester mon programme sur un autre PC et la ...bein tout va bien!!
Donc serais ce mon ordinateur qui pose probleme?

MErkiii

#25 Le 18/08/2008, à 14:20

tiky

Re : probleme de "free" progammation C

@Klubbin: Non ça dépend de l'état de la mémoire, des processus en cours, ...  tu peux manipuler des pointeurs invalides sans que ça fasse planter systématiquement ton programme, encore une fois, utilise valgrind !


Conseil d'expert: il vous faut un dentifrice adapté...

Hors ligne