Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1181 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  *** glibc detected *** free() oO

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

*** glibc detected *** free() oO

n°1294066
blastman
just me !
Posté le 28-01-2006 à 19:24:15  profilanswer
 

bonjour tout le monde
 
J'ai un petit problème pour apparement détruire un tableau alloué dynamiquement :
 
structure

Code :
  1. typedef
  2.   struct
  3.   {
  4.     int nbArticles; // nombre d'articles présents dans le tableau liste
  5.     Article *liste; // tableau d'articles alloué dynamiquement
  6.                     // le tableau doit contenir exactement nbArrticles cases
  7.   } ListeArticlesDyn;


 
initialisation

Code :
  1. void initialiserDyn(ListeArticlesDyn &liste)
  2. {
  3.   liste.nbArticles = 0;
  4.   liste.liste=new Article[liste.nbArticles];
  5. }


 
destruction

Code :
  1. void viderDyn(ListeArticlesDyn &liste)
  2. {
  3.   liste.nbArticles=0;
  4.   delete [] liste.liste; //on libere la memoire precedement reserve
  5. }


 
donc voilà lorsque je fais appel à la fonction viderDyn() le programme s'arrete et me met une erreur :

Code :
  1. *** glibc detected *** free(): invalid next size (fast): 0x0804c008 ***
  2. Abandon


 
j'ai essayé de le debugger avec gdb, il me met bien une erreur mais j'arrive pas à la comprendre :

Code :
  1. *** glibc detected *** free(): invalid next size (fast): 0x0804c008 ***
  2. Program received signal SIGABRT, Aborted.
  3. 0xb7d647a7 in raise () from /lib/tls/libc.so.6


 
Est ce une erreur de mon OS ou de mon prog, si quelqu'un peut m'aider ce serait sympa...


Message édité par blastman le 28-01-2006 à 19:25:37

---------------
http://www.blastmanu.info
mood
Publicité
Posté le 28-01-2006 à 19:24:15  profilanswer
 

n°1294068
Taz
bisounours-codeur
Posté le 28-01-2006 à 19:28:49  profilanswer
 

t'arrêtes de nous spammer ? t'as qu'à filer du Code C++ compilable et arrêter d'appeler 2x ta fonction.

n°1294073
blastman
just me !
Posté le 28-01-2006 à 19:44:47  profilanswer
 

oui désolé, le précédent post c'était une erreur de ma part (j'ai supprimé le post)
 
le code compilable en le réduisant j'arrive a 398 ligne oO  
 
je le post sur pastebin pour eviter de trop polluer ici
 
http://pastebin.com/527647


Message édité par blastman le 28-01-2006 à 19:51:59

---------------
http://www.blastmanu.info
n°1294076
Taz
bisounours-codeur
Posté le 28-01-2006 à 19:49:53  profilanswer
 

bon ben c'est pas la peine qu'on te réponde si tu supprimes tes posts. et en plus tu nous colles pas le code directement. comment veux-tu qu'on ait envie de t'aider vu comment tu ne respectes pas la charte ?
 
 
EDIT: et si tu nous file tes 400 lignes à compiler, c'est que tu te fiches de nous. Trouve le code incriminé et soumet un bout de code de moins de 50 lignes.


Message édité par Taz le 28-01-2006 à 19:50:48
n°1294077
push
/dev/random
Posté le 28-01-2006 à 19:50:56  profilanswer
 

tu peux rajouter valgrind à ta boite à outils

n°1294078
Taz
bisounours-codeur
Posté le 28-01-2006 à 19:52:38  profilanswer
 

et dégage tes typedef ou fais du C, choisi.
 
EDIT: et vire tes char*/char[], n'utilise que string.


Message édité par Taz le 28-01-2006 à 19:53:40
n°1294080
blastman
just me !
Posté le 28-01-2006 à 19:53:42  profilanswer
 

réduire a 50 ligne ca va être chaud (réduit a 355 là)


---------------
http://www.blastmanu.info
n°1294081
Taz
bisounours-codeur
Posté le 28-01-2006 à 19:56:13  profilanswer
 

par charité chrétienne :
 

Code :
  1. #
  2.   liste.nbArticles = 0;
  3. #
  4.   liste.liste=new Article[liste.nbArticles]; //on reserve la place


 
tu crois vraiment réserver quoi que ce soit là ?

n°1294083
blastman
just me !
Posté le 28-01-2006 à 19:57:35  profilanswer
 

j'aimerai bien pouvoir faire un beau code sans typedef, avec constructeur etc... mais je ne peux pas, c'est un TP et ce TP va être soumis a une correction semi-automatique (une appli que mon prof a developper) et pour que son appli fonctionne il faut que je respecte le squelette qu'il nous a filé (déclaration des type avec typedef, nom des procédure et fonction...) de plus je suis limité (par exemple: je ne peux pas utiliser de fonction toutes faites comme strstr() ou encore utiliser la STL etc...)


Message édité par blastman le 28-01-2006 à 20:06:31

---------------
http://www.blastmanu.info
n°1294084
blastman
just me !
Posté le 28-01-2006 à 19:59:35  profilanswer
 

Taz a écrit :

par charité chrétienne :
 

Code :
  1. #
  2.   liste.nbArticles = 0;
  3. #
  4.   liste.liste=new Article[liste.nbArticles]; //on reserve la place


 
tu crois vraiment réserver quoi que ce soit là ?


 
non, pas dans mon cas, mais c'est un commentaire généraliste en gros lorsque l'on initialise un pointeur avec new on lui reserve sa place en mémoire
 
dans mon TP il m'est demandé d'initialiser la variable passé en paramétre de sorte qu'elle contienne 0 article et pas de tableau dynamique


Message édité par blastman le 28-01-2006 à 20:03:24

---------------
http://www.blastmanu.info
mood
Publicité
Posté le 28-01-2006 à 19:59:35  profilanswer
 

n°1294086
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:00:17  profilanswer
 

MAIS VIRE CES TYPEDEF ÇA SERT À RIEN PUTAIN !
 
 
et string tu crois que c'est quoi ? c'est STL.

n°1294089
blastman
just me !
Posté le 28-01-2006 à 20:04:31  profilanswer
 

Taz a écrit :

MAIS VIRE CES TYPEDEF ÇA SERT À RIEN PUTAIN !
 
 
et string tu crois que c'est quoi ? c'est STL.


 
mais putain je sais mais j'ai pas le droit de les virer et pour string c'est une exception


---------------
http://www.blastmanu.info
n°1294090
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:06:01  profilanswer
 

bah alors utilise string partout. vire tes char * ! mieux dis à ton prof que les typedef ça sert à rien.

n°1294092
breizhbugs
Posté le 28-01-2006 à 20:09:34  profilanswer
 

Code :
  1. void initialiserDyn(ListeArticlesDyn &liste)
  2. {
  3.   liste.nbArticles = 0;
  4.   liste.liste=new Article[liste.nbArticles]; //on reserve la place
  5. }
  6. void ajouterArticleDyn(ListeArticlesDyn &liste, Article article)
  7. {
  8.   liste.nbArticles++;
  9.   if(liste.nbArticles>nbMaxArticles)
  10.     cout<<"Erreur, il n'y a plus de place pour ajouter un nouvel article.\n";
  11.   else
  12.     *(liste.liste + liste.nbArticles-1)=article;
  13. }


Tu initialise liste.liste a zero (->initialiserDyn)
et dans ajouterArticleDyn tu n'alloue pas de memoire pour stocker un element supplementaire!

n°1294093
blastman
just me !
Posté le 28-01-2006 à 20:10:23  profilanswer
 

pour mettre des string partout j'ai pas le droit là encore car je dois utiliser les chaine de caractère de C c'est pour ça qu'il y a un moment je convertis un string en char *:)


Message édité par blastman le 29-01-2006 à 01:02:32

---------------
http://www.blastmanu.info
n°1294094
blastman
just me !
Posté le 28-01-2006 à 20:13:51  profilanswer
 

breizhbugs a écrit :

Code :
  1. void initialiserDyn(ListeArticlesDyn &liste)
  2. {
  3.   liste.nbArticles = 0;
  4.   liste.liste=new Article[liste.nbArticles]; //on reserve la place
  5. }
  6. void ajouterArticleDyn(ListeArticlesDyn &liste, Article article)
  7. {
  8.   liste.nbArticles++;
  9.   if(liste.nbArticles>nbMaxArticles)
  10.     cout<<"Erreur, il n'y a plus de place pour ajouter un nouvel article.\n";
  11.   else
  12.     *(liste.liste + liste.nbArticles-1)=article;
  13. }


Tu initialise liste.liste a zero (->initialiserDyn)
et dans ajouterArticleDyn tu n'alloue pas de memoire pour stocker un element supplementaire!


 
ah ben oui quel con j'avais pas vu,  
 
si je fais ça dans mon else :
liste.liste=new Article[liste.nbArticles];
 
c'est correct ?


---------------
http://www.blastmanu.info
n°1294095
masklinn
í dag viðrar vel til loftárása
Posté le 28-01-2006 à 20:14:23  profilanswer
 

utilise malloc/free à la place de new/delete et poste en cat C, ça évitera que Taz se mange un AVC à chacun de tes posts [:pingouino]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1294097
blastman
just me !
Posté le 28-01-2006 à 20:16:54  profilanswer
 

et pour :

Code :
  1. *(liste.liste + liste.nbArticles-1)=article;


 
il n'y a pas une autre facon de l'écrire car je trouve que ca fais laid, non ?
 
(je peux pas l'ecrire comme ça  liste.liste[liste.nbArticles-1]=article; )


---------------
http://www.blastmanu.info
n°1294098
blastman
just me !
Posté le 28-01-2006 à 20:17:40  profilanswer
 

masklinn a écrit :

utilise malloc/free à la place de new/delete et poste en cat C, ça évitera que Taz se mange un AVC à chacun de tes posts [:pingouino]


 
 :pt1cable:  obligé d'utiliser new et delete


---------------
http://www.blastmanu.info
n°1294100
blastman
just me !
Posté le 28-01-2006 à 20:21:26  profilanswer
 

ca fonctionne nickel merci beaucoup


---------------
http://www.blastmanu.info
n°1294103
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:26:55  profilanswer
 

Code :
  1. #
  2. void cpStringAChar(string s, char tab[]) //D, R
  3. #
  4. {
  5. #
  6.   int i=0;
  7. #
  8. #
  9.       while(s[i])
  10. #
  11.         {
  12. #
  13.           tab[i]=s[i];
  14. #
  15.           i++;
  16. #
  17.         }
  18. #
  19.       tab[i]='\0';
  20. #
  21. }

ultra ptdr. tu peux y aller avec ta conversion

n°1294104
breizhbugs
Posté le 28-01-2006 à 20:28:07  profilanswer
 

blastman a écrit :

ah ben oui quel con j'avais pas vu,  
 
si je fais ça dans mon else :
liste.liste=new Article[liste.nbArticles];
 
c'est correct ?


 
Euh si tu veux perdre tous les elements deja presents dans le tableau, c'est ce qu'il faut faire!
 
Dis donc le but de ton TP c'est pas de faire un structure/classe "liste"?
Parce que une liste programmée avec un tableau c'est pas top, surtout de la facon dont tu t'y prends!
Fais une liste chainée t'aura moins de probleme!

n°1294109
blastman
just me !
Posté le 28-01-2006 à 20:37:43  profilanswer
 

non ce qu'il faut faire c'est exactement comme j'ai fais, le but c'est de nous faire réflechir a l'algorithme de nos procédure/fonction pas au codage (enfin j'éspère).  
 
et pas la possibilité d'utiliser une liste chainée car les structure mon été donné tel quel et je dois me demmerder avec ca sans y toucher :/  
 


---------------
http://www.blastmanu.info
n°1294110
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:38:44  profilanswer
 

c'est ton prof qui te l'a donné cette fonction cpStringAChar ?

n°1294111
blastman
just me !
Posté le 28-01-2006 à 20:40:29  profilanswer
 

non pas celle là


---------------
http://www.blastmanu.info
n°1294112
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:41:08  profilanswer
 

elle est ultra foireuse.

n°1294113
blastman
just me !
Posté le 28-01-2006 à 20:46:36  profilanswer
 

c'est possible je l'ai faites vite fais y a un bout de temps, faut que je regarde, mais bon c'est pas forcément evident de coder un truc propre et efficace en étant aussi limité.


---------------
http://www.blastmanu.info
n°1294114
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:48:06  profilanswer
 

qui te parle de propreté ou d'efficacité ? ta fonction elle marche pas. au mieux elle te fait un bufferoverflow chanceux, au pire c'est direct le segfault.

n°1294115
blastman
just me !
Posté le 28-01-2006 à 20:53:12  profilanswer
 

tu parle de celle là ? oO
 
void cpStringAChar(string s, char titre[])
{
for (int i=0; i<tailleMaxTitre; i++)
    titre[i]=s[i];
 
  titre[s.length()]='\0';  
}


---------------
http://www.blastmanu.info
n°1294116
Taz
bisounours-codeur
Posté le 28-01-2006 à 20:54:07  profilanswer
 

toujours aussi pourrie. pire en fait

n°1294117
Joel F
Real men use unique_ptr
Posté le 28-01-2006 à 20:55:34  profilanswer
 

tue ton prof, ou demande qu'on le vire. C'est un incapable doublé d'un crétin

n°1294119
blastman
just me !
Posté le 28-01-2006 à 20:57:52  profilanswer
 

Taz a écrit :

toujours aussi pourrie. pire en fait


 
ca fonctionne c'est sur, mais comment veux tu que je fasse un truc correct en etant aussi limité  


---------------
http://www.blastmanu.info
n°1294125
Taz
bisounours-codeur
Posté le 28-01-2006 à 21:10:53  profilanswer
 

en te documentant. si ton truc fonctionne, c'est par effet de bord. sinon c'est tout à fait invalide.

n°1294131
blastman
just me !
Posté le 28-01-2006 à 21:35:16  profilanswer
 

j'avais bien trouvé des trucs mais j'en ai PAS le droit


Message édité par blastman le 29-01-2006 à 01:05:38

---------------
http://www.blastmanu.info
n°1294132
push
/dev/random
Posté le 28-01-2006 à 21:39:50  profilanswer
 

blastman> juste 2 trucs, ne compte pas sur un '\0' dans un objet String comme pour une chaîne en C.. et n'as-tu pas le droit d'utiliser c_str ?

n°1294134
blastman
just me !
Posté le 28-01-2006 à 21:41:33  profilanswer
 

non :/
 
dans mon TP il m'est demandé d'initialiser la variable passé en paramétre de sorte qu'elle contienne 0 article et pas de tableau dynamique
 
que veut il bien dire par "et pas de tableau dynamique"  
 

Code :
  1. void initialiserDyn(ListeArticlesDyn &liste)
  2. {
  3. liste.nbArticles = 0;
  4. liste.liste=new Article[liste.nbArticles]; // ca ?
  5. }


Message édité par blastman le 28-01-2006 à 21:44:07

---------------
http://www.blastmanu.info
n°1294142
push
/dev/random
Posté le 28-01-2006 à 22:19:18  profilanswer
 

bein je sais pas, je suppose qu'il ne veut pas que ta liste soit réallouée en fonction du nombre d'article qu'il y a dedans ? que ce soit comme avec la version allouée statiquement ? mais c'est con, tu perds tout l'intérêt de la version allouée dynamiquement. donc tu lui mets un liste.liste=new Article[nbMaxArticles];
enfin je suppose hein [:petrus75]

n°1294145
breizhbugs
Posté le 28-01-2006 à 22:44:17  profilanswer
 

Moi,
je serais curieux de voir l'intitulé exact du TP, parce que de tout temps je n'ai jamais vu d'enoncer correctement exprimé...

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  *** glibc detected *** free() oO

 

Sujets relatifs
Ouvrir un espace web FREE depuis la Belgique ?remmettre le compteur Free à Zéro
Connexion à une base données free avec MyODBCparamètrer compteur visites free
.htaccess et .htpasswd utilisables sur les comptes Free?php marche en local mais pas chez free ? ?
Pb session freeinterroger une bese free
Affichage statistiques pages persos free[C] fonction free
Plus de sujets relatifs à : *** glibc detected *** free() oO


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR