Buenas, estoy desarrollando un software para generar aplicaciones paralelas sintéticas para investigación, y cuando ya creía tenerlo acabado, al añadir dos funcionalidades nuevas, me da un error de memoria.
El error que da es el siguiente:
*** glibc detected *** malloc(): memory corruption (fast): 0x08052228 ***
Nada que decir, típico error de algún puntero perdido. Información aportada, nula, salvo que sabemos que es por posiciones de memoria.
Lo tengo controlado, es decir, se que trozo de código lo produce, lo pongo a continuación:
else
{
mode=1;
fargv=(char **)malloc(sizeof(char *)*40);
while (!feof(arxiu))
{
fargv[0]=(char *)malloc(sizeof(NOM));
strcpy(fargv[0],NOM);
fargc=1;
entra=0;
fgets(s1,LINIA_ARXIU,arxiu);
ptr = strtok( s1, s2 );
if (ptr!=NULL)
{
//LA SIGUIENTE LÍNEA PRODUCE EL FALLO
fargv[fargc]=(char *)malloc(sizeof(ptr));
strcpy(fargv[fargc],ptr);
while( (ptr = strtok( NULL, s2 )) != NULL )
{
entra=1;
fargc++;
fargv[fargc]=(char *)malloc(sizeof(ptr));
strcpy(fargv[fargc],ptr);
}
fargc++;
if (entra==1)
ProcessarArguments(fargc,fargv);
for (i=(fargc);i>0;i--)//Se libera memoria
free(fargv[i-1]);
}
mode++;
}
Explico lo que hace éste trozo de código y comento lo del error.
Este codigo se encarga de leer una serie de argumentos que contiene un fichero, línea a línea, y secuenciar a estas, es decir, por ejemplo:
-g 3 -s 3 -c [1000,2000] -m 100 -i 3 -t 2 -w -o file1
-s 3 -g 4 -c [5000,6000] -m [1,200] -t 2 -w -i 5 -o file3
-s 12 -d 4 -c [1,50] -m 90 -i 2 -t 2 -w -o file4
Contiene líneas de este tipo, y se encarga de ponerlas secuenciadas una a una dentro del array fargv, parametro por parametro. De modo que cuando tengo una línea ejecuto todo el programa, y así línea a línea.
El problema viene, cuando he ejecutado la primera línea, todo correcto, hago el free, y empiezo a recoger datos de la segunda, pero cuando llego a esa línea, es decir, hago un malloc de fargv[1] previamente liberado en el for del final, me da el error.
Sé que el error está ahí, también sé como solucionarlo, quitando el for que libera memoria, si lo hago así no peta.
Pero por otro lado, no veo correcto tener empleada una memoria que no voy a usar, y estar reservando memoria sobre memoria anteriormente reservada.
Es decir, sé como corregirlo pero no me parece muy correcto.
Existe alguna manera alternativa de solucionarlo?
Saludos y gracias!!