fejl: glibc detected double free or corruption (out)

Tags:    c++



Jeg har et problem med følgende kode:

int administrativMedarbejder()
{
int i = 0;
while (i == 0)
{
if (hentPerson() != 0)
{
printf("fejl, systemet afsluttes");
exit(EXIT_FAILURE);
}
sorterPatient();
printf ("metoden fra administrende medarbejder patient:\\n");
printf("%s \\n", patientDerBearbejdes.cprArray);
printf("%c \\n", patientDerBearbejdes.prioritet);
printf("%c \\n", patientDerBearbejdes.skadeartChar);
}



return 0;
}

hvis jeg fjerner den første while løkke kører det fint, men så længe den er der for jeg følgende fejl når jeg prøver at kører programmet: *** glibc detected *** double free or corruption (out): 0x0804b1a8 ***. Nogen der ved hvad denne fejl betyder, eventuelt ved hvad der er galt. Jeg ved godt at løkken kører uendeligt, men det er også meningen, den metode den kører sender noget data ind i en message que til en anden process, og det er meningen den bare skal blive ved med dette.

Håber der er nogen der kan hjælpe mig.



4 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Tja, hvordan ser funktionerne hentPerson og sorterPatient ud?
Det burde være en af dem, der er årsag til fejlen.

1101110100010110000101000001

Killers don't end up in jail - they end up on a high-score!

[Redigeret d. 08/02-06 19:29:41 af Nicolai Lyster Fersner]





Jeg har et problem med følgende kode:

[..SNIP..]

Håber der er nogen der kan hjælpe mig.


Kan ikke umidlbart se hvad der er skyld i fejlen. Men vil tro at det er en fejl (hukommelse der ikke bliver frigivet, et. al.) i en af de to funktioner (hentPerson() og sorterPatient()). Er det C++? Hvor kommer patientDerBearbejdes fra?

Prøv evt. at sætte nogle printf()'ere indefter før og efter den første if()!

...olsen

[Redigeret d. 08/02-06 19:31:53 af Martin Olsen]



Det resterende kode ser ud som følger:

int hentPerson()
{
printf("test2");
patient patientp;
sleep(2);
if (msgrcv(msgidPatientTilSkraenke, (void *)&patientp, sizeof(patient) -4, 1, 0) == -1)
{
printf("fejl ved msgrcv");
exit(EXIT_FAILURE);
}
int i;
for (i = 0 ; i < 11 ; i++)
{
patientDerBearbejdes.cprArray = patientp.cprArray;
}
patientDerBearbejdes.prioritet = patientp.prioritet;
patientDerBearbejdes.skadeartChar = patientp.skadeartChar;
patientDerBearbejdes.patientType = 1;
/*printf ("metoden fra hentPerson patient:\\n");
printf("%s \\n", patientp.cprArray);
printf("%c \\n", patientp.prioritet);
printf("%c \\n", patientp.skadeartChar);
*/
return 0;
}

int sorterPatient()
{
int i = 0;
while (i == 0)
{
int filtjek = open(logtest, O_RDWR | O_CREAT | O_EXCL, 0444);
if (filtjek != -1)
{
i++;
}
}

FILE *patientlog;
FILE *mainLog;


int fejl;
mainLog = fopen("mainlog","a");


if(mainLog == NULL)
{
printf("Filen kunne ikke åbnes");
}
printf("fejlfinding");

//fprintf(mainLog, "test\\n");
fprintf(mainLog, "%s;", patientDerBearbejdes.cprArray);


fejl = fclose(mainLog);
printf("fejlfinding");

if(fejl != 0)
{
printf("fil kunne ikke lukkes");
}


if(patientDerBearbejdes.prioritet == 1)
{
char *fil = malloc(30);
strcpy(fil, "/tmp/g2logs/");
strcat(fil, patientDerBearbejdes.cprArray);
patientlog = fopen(fil,"w");
if(patientlog == NULL)
printf("Filen kunne ikke åbnes");
fprintf(patientlog, "Patienten er placeret på operationsstuen \\n %s", getKlokken());
fejl = fclose(patientlog);
if(fejl != 0);
if (msgsnd(msgidPatientFraSkraenkeTilOperation, (void *)&patientDerBearbejdes, sizeof(patient) -4, 0) == -1)
{
printf ("fejl ved msgsnd");
exit (EXIT_FAILURE);
}
}
else
{
char *fil = malloc(30);
strcpy(fil, "/tmp/g2logs/");
strcat(fil, patientDerBearbejdes.cprArray);
patientlog = fopen(patientDerBearbejdes.cprArray,"w");
if(patientlog == NULL)
printf("Filen kunne ikke åbnes");

fprintf(patientlog, "Patienten er placeret i venteværelset \\n %s", getKlokken());
fejl = fclose(patientlog);


if (msgsnd(msgidPatientFraSkraenkeTilVentevaerelse, (void *)&patientDerBearbejdes, sizeof(patient) -4, 0) == -1)
{
printf ("fejl ved msgsnd");
exit (EXIT_FAILURE);
}
}
(void)unlink(logtest);
return 0;
}

char *getKlokken() //http://souptonuts.sourceforge.net/code/gettimeofday.c.html er tilpasset
{
char *tempChar;
char buffer[30];
size_t size = 1;
tempChar = (char *)malloc(size);
struct timeval tv;


time_t curtime;

gettimeofday(&tv, NULL);
curtime=tv.tv_sec;

strftime(buffer,30,"%m-%d-%Y %T.",localtime(&curtime));
sprintf(tempChar, buffer);

printf("Test %s \\n" , tempChar);

return tempChar;

}




Normalt ville jeg sige at fejlen skyldes at du frigiver den samme hukommelse 2 gange (med free) eller at du frigiver noget hukommelse med free som ikke er allokeret med malloc eller at du har skrevet ud over enden på noget hukommelse allokeret med malloc.

Men du har ingen free i den kode du har vist...



t