View Full Version : [C]la free() a runtime dà "invalid next size"..
santaclause83
10-09-2007, 21:17
in seguito a delle free su puntatori a stringhe,quando mando il programma in esecuzione viene fuori questo errore
*** glibc detected *** free(): invalid next size (fast): 0x0804d070 ***
non riesco a trovare l'errore,nel codice ho visto dove si genera ma non so come poter rimediare anche perchè non ne conosco il significato...
..suggerimenti??
grazie mille
santaclause83
10-09-2007, 22:22
la cosa strana è che questa free è dentro uno switch dove ogni volta viene controllato l'input,eseguiti task,riazzerate le variabili e liberata la memoria per la richiesta del task successivo:
alla prima volta la free non dà problemi
la seconda volta,dopo aver eseguito le stesse cose sotto lo stesso caso dello switch,sul medesimo puntatore la free stampa su schermo l'errore...
sto navigando in rete+leggendo la teoria ma questi errori non sono mai trattati
:muro:
santaclause83
11-09-2007, 17:32
while(1){
/*5-->entrata nel ciclo di ricezione comandi dal client*/
printf("in attesa della prossima richiesta su %s....\n",dir_richieste);
receive(&secondo_mess,fd_richieste);
printf("secondo mess = %s;\n",secondo_mess);
char * pEnd;
int j = 0;
int caratterimat = 0;
char * request;
char * nomemat1;
char * nomemat2;
char * nomemat3;
char * operando;
char * esito;
//uso la funzione strtol per estrarre il codice operativo del comando
cod_op = strtol(secondo_mess,&pEnd,10);
printf("codice operativo = %d\n",cod_op);
//entro nell'esecuzione dei comandi
switch(cod_op){
case 0:
lung_secondo = strlen(secondo_mess);
if((request = (char *)calloc(lung_secondo,sizeof(char)))== NULL){
printf("malloc per inizializzazione comando fallita,terminazione client");
exit(1);
}
while(j != lung_secondo){
request[j]=secondo_mess[j];
j++;
}
request[j]='\0';
printf("comando = %s;\n",request);
//alloco lo spazio per il nome della matrice
if((nomemat1 = (char *)malloc(sizeof(char)*MAX_NOME))== NULL){
printf("malloc per inizializzazione comando fallita,terminazione client");
exit(1);
}
j=0;
while(request[j+1] != '_'){
printf("%c\n",request[j+1]);
nomemat1[j]=request[j+1];
j++;
}
nomemat1[j]= '\0';
caratterimat = strtol(&request[j+2],&pEnd,10);
printf("nomemat = %s,datimat = %s,numero caratteri = %d,dati matrice = %s\n",nomemat1,request,caratterimat,pEnd);
//controlla se è già stata inizializzata dall'insieme delle matrici,nel caso restiuisce un errore
int check;
if((check = checkname(insiememat,nomemat1,NOT_DEL))!=-1){
if((esito = (char *)malloc(sizeof(char)*SIZE_MAT_ERROR+1)) == NULL){
printf("malloc per inizializzazione comando fallita,terminazione client");
exit(1);
}
esito = "Error:unable to change matrix size";
send(esito,fd_client);
}
//inizializza la matrice e la inserisce nell'insieme delle matrici
else{
add_in_matset(insiememat,mat_create,nomemat1,pEnd);
esito = "ok";
send(esito,fd_client);
}
printf("secondomess= %s\n",secondo_mess);
free(secondo_mess);
printf("request= %s\n",request);
free(request);
break;
Assegnazioni come questa:
esito = "Error:unable to change matrix size";
non vanno bene...perdi il puntatore allo spazio allocato per esito.
Usa la funzione strcpy per inserire del testo in una stringa per cui hai già allocato lo spazio.
santaclause83
12-09-2007, 10:42
corretto l'errore con esito..però l'errore persiste
nello switch case per ora sto testando solo il caso 0,e mando input su input che riguardano solo quel caso.
pare che capiti dopo l'ultima free del caso zero,quella su "request",poco sopra l'inizio del caso 1.
la cosa strana è che il messaggio di errore sulla free si presenta solo ed esclusivamente alla seconda volta che mando l'input,se non si blocca la seconda volta,va avanti senza problemi(chiaramente non so esattamente fino a quando,l'avrò fatto altre 10 volte e ho visto che non si bloccava mai)
:confused:
receive(&secondo_mess,fd_richieste);
Perché mandi alla receive l'indirizzo del puntatore al buffer e non il puntatore stesso?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.