Libération de la mémoire

biba -  
 biba -
Bonsoir,
mon code consiste à allouer une matrice et un vecteur dynamiquement puis les libérer et ceci dans un boucle pour incrémenter la dimension à chaque fois, mais en arrivant à la taille 6, je ne sais pas ce qui se passe, ce message s'affiche:

*** glibc detected *** ./test: free(): invalid next size (fast): 0x091fcda0 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7e97454]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7e994b6]
./testlu2par[0x8049385]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7e3e685]
./testlu2par[0x80488d1]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 08:05 50300 /home/soussou/testlu2par
0804a000-0804b000 rw-p 00001000 08:05 50300 /home/soussou/testlu2par
091f8000-09219000 rw-p 091f8000 00:00 0 [heap]
b7d00000-b7d21000 rw-p b7d00000 00:00 0
b7d21000-b7e00000 ---p b7d21000 00:00 0
b7e11000-b7e12000 ---p b7e11000 00:00 0
b7e12000-b7e22000 rwxp b7e12000 00:00 0
b7e22000-b7e23000 rw-p b7e22000 00:00 0
b7e23000-b7e25000 r-xp 00000000 08:05 1524393 /lib/tls/i686/cmov/libdl-2.8.90.so
b7e25000-b7e26000 r--p 00001000 08:05 1524393 /lib/tls/i686/cmov/libdl-2.8.90.so
b7e26000-b7e27000 rw-p 00002000 08:05 1524393 /lib/tls/i686/cmov/libdl-2.8.90.so
b7e27000-b7e28000 rw-p b7e27000 00:00 0
b7e28000-b7f80000 r-xp 00000000 08:05 1524390 /lib/tls/i686/cmov/libc-2.8.90.so
b7f80000-b7f82000 r--p 00158000 08:05 1524390 /lib/tls/i686/cmov/libc-2.8.90.so
b7f82000-b7f83000 rw-p 0015a000 08:05 1524390 /lib/tls/i686/cmov/libc-2.8.90.so
b7f83000-b7f86000 rw-p b7f83000 00:00 0
b7f86000-b7f9b000 r-xp 00000000 08:05 1524404 /lib/tls/i686/cmov/libpthread-2.8.90.so
b7f9b000-b7f9c000 r--p 00014000 08:05 1524404 /lib/tls/i686/cmov/libpthread-2.8.90.so
b7f9c000-b7f9d000 rw-p 00015000 08:05 1524404 /lib/tls/i686/cmov/libpthread-2.8.90.so
b7f9d000-b7f9f000 rw-p b7f9d000 00:00 0
b7f9f000-b7fac000 r-xp 00000000 08:05 1507340 /lib/libgcc_s.so.1
b7fac000-b7fad000 r--p 0000c000 08:05 1507340 /lib/libgcc_s.so.1
b7fad000-b7fae000 rw-p 0000d000 08:05 1507340 /lib/libgcc_s.so.1
b7fae000-b8035000 r-xp 00000000 08:05 1613912 /opt/intel/Compiler/11.1/064/lib/ia32/libiomp5.so
b8035000-b803c000 rw-p 00086000 08:05 1613912 /opt/intel/Compiler/11.1/064/lib/ia32/libiomp5.so
b803c000-b8042000 rw-p b803c000 00:00 0
b8042000-b8066000 r-xp 00000000 08:05 1524394 /lib/tls/i686/cmov/libm-2.8.90.so
b8066000-b8067000 r--p 00023000 08:05 1524394 /lib/tls/i686/cmov/libm-2.8.90.so
b8067000-b8068000 rw-p 00024000 08:05 1524394 /lib/tls/i686/cmov/libm-2.8.90.so
b8068000-b8069000 rw-p b8068000 00:00 0
b8069000-b8070000 r-xp 00000000 08:05 1524406 /lib/tls/i686/cmov/librt-2.8.90.so
b8070000-b8071000 r--p 00007000 08:05 1524406 /lib/tls/i686/cmov/librt-2.8.90.so
b8071000-b8072000 rw-p 00008000 08:05 1524406 /lib/tls/i686/cmov/librt-2.8.90.so
b8082000-b8085000 rw-p b8082000 00:00 0
b8085000-b809f000 r-xp 00000000 08:05 2777090 /lib/ld-2.8.90.so
b809f000-b80a0000 r-xp b809f000 00:00 0 [vdso]
b80a0000-b80a1000 r--p 0001a000 08:05 2777090 /lib/ld-2.8.90.so
b80a1000-b80a2000 rw-p 0001b000 08:05 2777090 /lib/ld-2.8.90.so
bfb99000-bfbac000 rwxp bffeb000 00:00 0 [stack]
bfbac000-bfbae000 rw-p bfffe000 00:00 0
Aborted
voici mon bout du code:
for(dim=0; dim<=size; dim=dim+inc)
{

/* allocation dynamique de la matrice et du vecteur */
a=(float*)malloc(dim*dim*sizeof(float));
b=(float*)malloc(dim*sizeof(float));

{instructions}
free(a);
free(b);

}

2 réponses

john
 
Bonjour,

Est ce que tu vérifies que les appels malloc ce sont bien déroulés ? (je ne crois pas).
Parce dans le cas où l'appel échoue, lorsque tu appelles free c'est normal que ca plante...
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Non pas vraiment.
Si malloc échoue, alors il renverra NULL. Et comme free(NULL) est une opération correcte, ce n'est pas de là que vient l'erreur. S'il faut vérifier les malloc, c'est pour ne pas tenter d'accéder à la zone non allouée qui provoquerait le segfault assuré.
0
fiddy Messages postés 11653 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Bonjour,

Pourrait-on voir les déclarations des variables a et b ?
Tu oublies de vérifier la valeur de retour des allocations. Si elles échouent et que tu accèdes aux pointeurs après, ça va cracher.
En tout cas, tu n'as pas poster assez de code pour qu'on se fasse une idée précise de l'erreur.
0
biba
 
Bonsoir,
merci de m'avoir répondu et essayer de m'aider,voici la fonction main:

int main(int argc,char** argv)
{float * a,*b;
int size,i,j,dim,inc;
double nsec,rap,ordre;
struct timespec start, end;

srand(time(NULL));
/* recuperation des arguments taille maximale et incrementation */
size=atoi(argv[1]);
inc=atoi(argv[2]);

/* initialisation de time */


printf("dimension ordre temp rapport\n");

for(dim=0; dim<=size; dim=dim+inc)
{


/* allocation dynamique de la matrice et du vecteur */
a=(float*)malloc(dim*dim*sizeof(float));
b=(float*)malloc(dim*sizeof(float));



/* initialisation */

#pragma omp parallel for
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
a[i*dim+j]=1+(int) (10.0*rand()/(RAND_MAX+1.0));
// {
// printf("Donnez un élément de a \n");
// scanf("%f",&a[dim*i+j]);
// }

#pragma omp parallel for
for(i=0;i<dim;i++)
b[i]=1+(int) (10.0*rand()/(RAND_MAX+1.0));
// { printf("\ndonner un élément de b\n");
// scanf("%f",&b[i]);
// }

//CALLGRIND_ZERO_STATS;
//lecture du temp debut
clock_gettime(CLOCK_THREAD_CPUTIME_ID,&start);

/*Résolution du système par factorisation LU */

Solve( a, b, dim);

//CALLGRIND_DUMP_STATS;
clock_gettime(CLOCK_THREAD_CPUTIME_ID,&end);// lecture du temp d'arrêt

nsec =(end.tv_sec * 1e9 + end.tv_nsec) - (start.tv_sec * 1e9 + start.tv_nsec) ;// calcul de l'intervalle

/* liberer la memoire */

free(a);
free(b);
ordre=dim*dim*dim;
rap=nsec/ordre;

/* affiche le temp d'execution */

printf("%d %lf %lf %lf S\n",dim,ordre,nsec,rap);

}
return (0);
}

merci infiniment!
0