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

*** glibc detected *** free() oO - C++ - Programmation

Marsh Posté le 28-01-2006 à 19:24:15    

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
Reply

Marsh Posté le 28-01-2006 à 19:24:15   

Reply

Marsh Posté le 28-01-2006 à 19:28:49    

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

Reply

Marsh Posté le 28-01-2006 à 19:44:47    

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
Reply

Marsh Posté le 28-01-2006 à 19:49:53    

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
Reply

Marsh Posté le 28-01-2006 à 19:50:56    

tu peux rajouter valgrind à ta boite à outils

Reply

Marsh Posté le 28-01-2006 à 19:52:38    

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
Reply

Marsh Posté le 28-01-2006 à 19:53:42    

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


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 28-01-2006 à 19:56:13    

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à ?

Reply

Marsh Posté le 28-01-2006 à 19:57:35    

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
Reply

Marsh Posté le 28-01-2006 à 19:59:35    

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
Reply

Marsh Posté le 28-01-2006 à 19:59:35   

Reply

Marsh Posté le 28-01-2006 à 20:00:17    

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

Reply

Marsh Posté le 28-01-2006 à 20:04:31    

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
Reply

Marsh Posté le 28-01-2006 à 20:06:01    

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

Reply

Marsh Posté le 28-01-2006 à 20:09:34    

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!

Reply

Marsh Posté le 28-01-2006 à 20:10:23    

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
Reply

Marsh Posté le 28-01-2006 à 20:13:51    

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
Reply

Marsh Posté le 28-01-2006 à 20:14:23    

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
Reply

Marsh Posté le 28-01-2006 à 20:16:54    

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
Reply

Marsh Posté le 28-01-2006 à 20:17:40    

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
Reply

Marsh Posté le 28-01-2006 à 20:21:26    

ca fonctionne nickel merci beaucoup


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 28-01-2006 à 20:26:55    

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

Reply

Marsh Posté le 28-01-2006 à 20:28:07    

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!

Reply

Marsh Posté le 28-01-2006 à 20:37:43    

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
Reply

Marsh Posté le 28-01-2006 à 20:38:44    

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

Reply

Marsh Posté le 28-01-2006 à 20:40:29    

non pas celle là


---------------
http://www.blastmanu.info
Reply

Marsh Posté le 28-01-2006 à 20:41:08    

elle est ultra foireuse.

Reply

Marsh Posté le 28-01-2006 à 20:46:36    

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
Reply

Marsh Posté le 28-01-2006 à 20:48:06    

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.

Reply

Marsh Posté le 28-01-2006 à 20:53:12    

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
Reply

Marsh Posté le 28-01-2006 à 20:54:07    

toujours aussi pourrie. pire en fait

Reply

Marsh Posté le 28-01-2006 à 20:55:34    

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

Reply

Marsh Posté le 28-01-2006 à 20:57:52    

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
Reply

Marsh Posté le 28-01-2006 à 21:10:53    

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

Reply

Marsh Posté le 28-01-2006 à 21:35:16    

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
Reply

Marsh Posté le 28-01-2006 à 21:39:50    

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 ?

Reply

Marsh Posté le 28-01-2006 à 21:41:33    

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
Reply

Marsh Posté le 28-01-2006 à 22:19:18    

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]

Reply

Marsh Posté le 28-01-2006 à 22:44:17    

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é...

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed