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

  FORUM HardWare.fr
  Programmation
  C++

  free() invalid next size(fast)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

free() invalid next size(fast)

n°2028714
kranagard
Posté le 12-10-2010 à 17:23:35  profilanswer
 

Bonjours, je sais que ce message d'erreur est assez redondant et qu'on trouve beaucoup de postes sur le sujet mais apres avoir lu, relue et revérifié mon code je ne vois vraiment pas d'où ça vient.
 
il s'agit d'un échange de messages entre client et serveur, ceux-ci ayant les mêmes sockets (une classe qui utilise directement les fonctions recv/ send...)
 
 
la connexion se passe bien, des premiers messages circulent sur le réseau sans soucis et d'un coups j'ai cette erreur. voici un bout de code précédant celle ci (entre l'allocation et le free en fait)
 

Code :
  1. char* mSocket::Read(int& taille)
  2. {
  3.     int val;
  4.     if((val = recv(sock,&taille,sizeof(int),0))==-1)
  5.         throw new ExceptionServeur(string(strerror(errno)));
  6. else if(val == 0)
  7.  throw new ExceptionServeur("fermeture du client detectee" );
  8.     char *bArray = NULL;
  9.     bArray = new char(taille+1);
  10.     memset(bArray,0,taille+1);
  11.     if((val = recv(sock,bArray,taille,0))==-1)
  12.         throw new ExceptionServeur(string(strerror(errno)));
  13.     return bArray;
  14. }


Code :
  1. char* reponse = NULL;
  2.     reponse = socket->Read(taille);
  3.     if(strncmp(reponse,"ACK",3)==0)
  4.     {
  5.         free(reponse);
  6.         reponse = socket->Read(taille);
  7.         string rep(reponse);
  8.         free(reponse);
  9.         *ret = parseCVS(rep);
  10.     }


 
la socket récupère 4 octets en premier, un int contenant la taille du message qui arrive. puis alloue la bonne taille pour réceptionner le message.
enfin voila, ça fait un moment que je me prends la tête la dessus donc si quelqu'un a une idée je suis vraiment preneur...
 
se trouve en tête de mon bout de code la réception et le free de la réception d'un message précédant, celui ci contenant un ACK applicatif. de plus si je commente le free() qui plante l'appelle suivant d'un read plante avec la même erreur.
 
 
un signal est aussi émit (selon linux qui me l'affiche dans l'indicateur de message): SIGABRT

Message cité 1 fois
Message édité par kranagard le 12-10-2010 à 17:27:15
mood
Publicité
Posté le 12-10-2010 à 17:23:35  profilanswer
 

n°2028759
xilebo
noone
Posté le 12-10-2010 à 18:58:28  profilanswer
 

kranagard a écrit :

Bonjours, je sais que ce message d'erreur est assez redondant et qu'on trouve beaucoup de postes sur le sujet mais apres avoir lu, relue et revérifié mon code je ne vois vraiment pas d'où ça vient.
 
il s'agit d'un échange de messages entre client et serveur, ceux-ci ayant les mêmes sockets (une classe qui utilise directement les fonctions recv/ send...)
 
 
la connexion se passe bien, des premiers messages circulent sur le réseau sans soucis et d'un coups j'ai cette erreur. voici un bout de code précédant celle ci (entre l'allocation et le free en fait)
 

Code :
  1. char* mSocket::Read(int& taille)
  2. {
  3.     int val;
  4.     if((val = recv(sock,&taille,sizeof(int),0))==-1)
  5.         throw new ExceptionServeur(string(strerror(errno)));
  6. else if(val == 0)
  7.  throw new ExceptionServeur("fermeture du client detectee" );
  8.     char *bArray = NULL;
  9.     bArray = new char(taille+1);
  10.     memset(bArray,0,taille+1);
  11.     if((val = recv(sock,bArray,taille,0))==-1)
  12.         throw new ExceptionServeur(string(strerror(errno)));
  13.     return bArray;
  14. }


Code :
  1. char* reponse = NULL;
  2.     reponse = socket->Read(taille);
  3.     if(strncmp(reponse,"ACK",3)==0)
  4.     {
  5.         free(reponse);
  6.         reponse = socket->Read(taille);
  7.         string rep(reponse);
  8.         free(reponse);
  9.         *ret = parseCVS(rep);
  10.     }


 
la socket récupère 4 octets en premier, un int contenant la taille du message qui arrive. puis alloue la bonne taille pour réceptionner le message.
enfin voila, ça fait un moment que je me prends la tête la dessus donc si quelqu'un a une idée je suis vraiment preneur...
 
se trouve en tête de mon bout de code la réception et le free de la réception d'un message précédant, celui ci contenant un ACK applicatif. de plus si je commente le free() qui plante l'appelle suivant d'un read plante avec la même erreur.
 
 
un signal est aussi émit (selon linux qui me l'affiche dans l'indicateur de message): SIGABRT


 
pour allouer un tableau ce n'est pas  
 

Code :
  1. bArray = new char(taille+1); //( allocation d'un char avec pour paramètre de constructeur taille + 1 )


 
mais  

Code :
  1. bArray = new char[taille+1];// ( allocation d'un tableau de char de taille + 1 éléments )


 
et pour désallouer un new [], on fait un delete[] et non un free.
 
Edit : ton memset suivant fait un bel écrasement mémoire.


Message édité par xilebo le 12-10-2010 à 18:59:08
n°2028798
kranagard
Posté le 12-10-2010 à 22:25:31  profilanswer
 

oh c'est pas bête du tout ça :/
ça fait un moment que je n'ai pas touché autre chose que du java du coups les allocation mémoire j'ai des trous... merci beaucoup en tout cas, je teste ça de suite :)

n°2028826
Taz
bisounours-codeur
Posté le 13-10-2010 à 07:54:30  profilanswer
 

Sinon utilise un vector<char> ça sera plus pratique.


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

  free() invalid next size(fast)

 

Sujets relatifs
Question existentielle : free()Free_Will
référencer ma page perso freePiratage - Page perso Free - .htaccess
Condition If...End if à l'intérieur d'une boucle For...Nextconnection pages perso free
pourquoi ça marche chez free et pas chez moi ?Free - mail et contenu html
erreur keytool : java.io.IOException: Invalid keystore format*** glibc detected *** free(): invalid next size (fast)
Plus de sujets relatifs à : free() invalid next size(fast)


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