A la quete de '** glibc detected ** free()' [Resolu] - C - Programmation
Marsh Posté le 16-02-2006 à 23:19:51
oui, tu dois donner à free l'adresse retournée par malloc, utilises un autre pointeur pour te déplacer sur la zone allouée
Code :
|
Citation : |
ca peut ne pas venir directement de free mais d'une fonction qui appelle free, genre fclose
Marsh Posté le 17-02-2006 à 00:51:53
Ouais, c'est ce que j'aurais choisi comme alternative si je suis obligé de réutiliser le pointeur intial du malloc.
J'utilise la libxml, je pense qu'il peut-etre une des cause du message :
*** glibc detected ***
Marsh Posté le 17-02-2006 à 05:05:21
Le message, c'est parce que tu passes a free() un pointeur vers une zone qui n'a pas été allouée par malloc(). Y'a pas à chercher ailleurs.
Marsh Posté le 17-02-2006 à 19:12:14
Je continue ma quete de cette erreur ... j'ai pu ainsi découvrir des outils, tel que valgrind et electric-fence ...
Avec valgrind, je suis à 205 erreurs ... Ils disent que dépasser 100 ereurs, le détails n'est plus affiché
Je suis passé à electric-fence ...
(...)
printf("ii) %s %s\n",tmp,res);
strcat(tmp,res);
printf("iii)\n" );
(...)
Le programme s'arrete sur le strcat par un SEGFAULT ... le premier printf m'affiche bien tmp=val1 et res=val2
La trace de gdb :
(gdb) run |
Là, je ne vois pas ce qui bloque ..
Marsh Posté le 17-02-2006 à 19:22:37
Olivier51 a écrit :
|
Comment est défini 'tmp' ?
Que contient (ou 'sur quoi pointe') 'res' ?
Marsh Posté le 17-02-2006 à 19:34:58
Effectivement, j'ai pas été assez attentif, mauvaise taille avec le malloc ...
Problème presque résolu ... plus que 1 erreur avec valgrind !!!
Je recommande beaucoup Electric-fence + gdb à ceux qui aurait des problème de 'mémoire' et qui lirait ce sujet à la recherche de solutions.
Marsh Posté le 17-02-2006 à 19:41:42
Problème résolu ...
Conclusion : mauvaise taille avec le malloc qui ne fait pas planté forcément en cas de dépassement le programme sous Linux.
Solution pour trouver le problème : Electric-fence + gdb
Marsh Posté le 17-02-2006 à 20:37:24
Olivier51 a écrit : Problème résolu ... |
Ca, c'est pour réparer... Il vaut mieux se concentrer sur la conception et le codage et ne pas faire d'erreur, ou utiliser des méthodes 'souples' (autodémerdantes). Personnellement, j'ai résolu le problème des chaines avec ce code :
http://mapage.noos.fr/emdel/clib.htm
Module FSTR
Marsh Posté le 17-02-2006 à 20:46:05
pourquoi on aurait pas dans la bibliothèque standard un type string complexe comme ton fstr ?
Marsh Posté le 17-02-2006 à 21:02:12
skelter a écrit : pourquoi on aurait pas dans la bibliothèque standard un type string complexe comme ton fstr ? |
Ca existe dans d'autres langages ...
Le C a sû rester simple, mais extensible exactement selon nos besoins. Le contraire d'une usine à gaz à la Java ou C++...
Marsh Posté le 16-02-2006 à 23:03:50
Je suis actuellement bloqué dans un de mes programmes ... par cette erreur à l'execution ...
*** glibc detected *** free(): invalid next size (fast): 0x0806d768 ***
Il plante sur un endroit où il n'y a pas de free() et d'ailleurs, je ne libère pas la mémoire dans cette environ ...
Je me suis dit que ça pouvait venir d'une libération automatique lorsqu'une variable allouée par un malloc ne sera plus utilisée ...
Par contre, dans mes sources j'utilise ce genre d'opération, et je ne sais pas si c'est bien ...
char* buffer = (char*)malloc(1000);
(...)
buffer++; (je ne sais pas si ça marche, mais en gros je modifie l'emplacement pointé initialement par buffer)
(...)
et du coup, est-ce que si je fais un free() sur buffer, je ne vais pas avoir une erreur puisque ce n'est pas l'emplacement initiale alloué par malloc()
Message édité par Olivier51 le 17-02-2006 à 19:42:42