Pointer being freed was not allocated...
Résolu/Fermé
Utilisateur anonyme
-
5 déc. 2016 à 00:10
mamiemando Messages postés 33352 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 12 novembre 2024 - 8 déc. 2016 à 10:01
mamiemando Messages postés 33352 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 12 novembre 2024 - 8 déc. 2016 à 10:01
A voir également:
- Error for object pointer being freed was not allocated
- The requested url was rejected. please consult with your administrator. ✓ - Forum Réseaux sociaux
- Fan error lenovo ✓ - Forum Refroidissement
- Downloader for pc - Télécharger - Téléchargement & Transfert
- Network error ✓ - Forum Réseaux sociaux
- Network error iptv - Forum Réseaux sociaux
1 réponse
mamiemando
Messages postés
33352
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 novembre 2024
7 804
Modifié par mamiemando le 7/12/2016 à 10:00
Modifié par mamiemando le 7/12/2016 à 10:00
Bonjour,
Sans le code complet c'est un peu dur de déboguer et de suivre ton programme, mais en gros, tu fais un free sur un pointeur qui n'a pas été
À titre personnel je trouve beaucoup bien compliquée la manière dont est écrite le programme pour quelque chose qui me paraît assez simple.
- Des boucles
- Il n'est pas forcément nécessaire de passer par un index pour progresser dans un tableau de pointeur (incrémenter un pointeur suffirait). Par exemple si tu as un tableau d'entier
- Je suis sceptique sur le besoin de manipuler un
Exemple :
Donc mon conseil serait :
1) simplifie ton code
2) débogue le avec
3) si tu es bloqué, donne nous un extrait de code minimal qu'on peut compiler et déboguer.
Bonne chance
Sans le code complet c'est un peu dur de déboguer et de suivre ton programme, mais en gros, tu fais un free sur un pointeur qui n'a pas été
malloc. Un outil comme
valgrindou
gdbte permettrait de déterminer à quelle ligne tu t'es trompé.
À titre personnel je trouve beaucoup bien compliquée la manière dont est écrite le programme pour quelque chose qui me paraît assez simple.
- Des boucles
forseraient plus lisibles
- Il n'est pas forcément nécessaire de passer par un index pour progresser dans un tableau de pointeur (incrémenter un pointeur suffirait). Par exemple si tu as un tableau d'entier
int *tab, et un pointeur sur la case courante int *pi = *tab (ici placé sur *tab == tab[0]), écrire pi++ le fait passer à la case suivante.
- Je suis sceptique sur le besoin de manipuler un
char ****pour représenter ton environnement. Surtout qu'au final dans toute ta fonction tu utilises
**enven pratique.
Exemple :
char * s = "bonjour"; char * pc; for (pc = s; *pc; pc++) printf("%c", *pc);
Donc mon conseil serait :
1) simplifie ton code
2) débogue le avec
gdbou
valgrind.
3) si tu es bloqué, donne nous un extrait de code minimal qu'on peut compiler et déboguer.
Bonne chance
Modifié par EchoIsON le 7/12/2016 à 20:04
Je ne peux pas faire grand chose pour simplifier mon code étant donné que je suis une norme spécifique donc je n'ai pas le droit d'utiliser les boucles for :)
Je ne peux pas bouger mon pointeur sur env, parce-que je travaille directement avec son adresse ici donc j'ai besoin de réutiliser env dans d'autres fonctions en gardant un pointeur au début.
Sinon pour la manipulation d'un char **** c'est parce-que la fonction est appelée d'assez loin et j'ai besoin à chaque fois de modifier ma variable env.
gdb et valgrind n'ont rien donné, c'est pour ça que j'ai demandé de l'aide ici.
Sinon, j'ai réussi à debugguer mon programme, la source du problème venait d'une autre fonction (setenv, celle d'insertion des éléments dans l'environnement). En gros, les variables d'environnement récupérées au lancement du programme n'ont pas nécessité une allocation de mémoire avec malloc, ou alors le pointeur a bougé depuis. Donc évidemment, lorsque j'essayais de les free, je recevais une erreur (tandis que je pouvais free les NOUVEAUX éléments ajoutés par mon programme, qui eux, ont demandé un malloc).
Pour régler le problème, j'ai tout simplement placé dans un buffer (déclaré en static), à la suite, tous les nouveaux éléments que j'ai malloc : donc au moment du free, je vérifie si le pointeur existe (chose que je faisais déjà) ET que la variable que j'essaie de supprimer se trouve dans le buffer (ce qui implique qu'elle a été malloc par mon programme).
Voilà :)
Bonne soirée.
PS : voici le code modifié et fonctionnel
8 déc. 2016 à 10:01