Perché ricevo un SIGABRT qui?

Ho questo segmento di codice in cui sto aprendo / chiudendo un file un certo numero di volte (in un ciclo):

for(i=1;i<max;i++) { /* other code */ plot_file=fopen("all_fitness.out","w"); for (j=0;j<pop_size;j++) fprintf(plot_file, "%lf %lf\n",oldpop[i].xreal[0],oldpop[i].obj); fclose(plot_file); /*other code*/ } 

Ho un SIGABRT qui, con il seguente backtrace:

 #0 0x001fc422 in __kernel_vsyscall () #1 0x002274d1 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64 #2 0x0022a932 in *__GI_abort () at abort.c:92 #3 0x0025dee5 in __libc_message (do_abort=2, fmt=0x321578 "*** glibc detected *** %s: %s: 0x%s ***\n") at ../sysdeps/unix/sysv/linux/libc_fatal.c:189 #4 0x00267ff1 in malloc_printerr (action=, str=0x6 
, ptr=0x8055a60) at malloc.c:6217 #5 0x002696f2 in _int_free (av=, p=) at malloc.c:4750 #6 0x0026c7cd in *__GI___libc_free (mem=0x8055a60) at malloc.c:3716 #7 0x0025850a in _IO_new_fclose (fp=0x8055a60) at iofclose.c:88 #8 0x0804b9c0 in main () at ga.c:1100

Il numero di riga 1100, è la riga in cui sto facendo il fclose() nel segmento di codice sopra. Qual è la ragione del comportamento sopra? Ogni suggerimento è apprezzato.

(Sono su Linux e uso gcc)

Quando chiamate fclose() , glibc rilascia alcune strutture allocate dynamicmente; internamente c’è una chiamata free() . malloc() e free() basano su strutture piuttosto complesse e costruite dynamicmente. Apparentemente, glibc ha scoperto che le strutture erano in uno stato incoerente, al punto che non è ansible eseguire un rilascio sicuro della memoria. Glibc decise che il problema era abbastanza serio da giustificare l’immediata interruzione.

Ciò significa che hai un bug da qualche parte nel tuo codice, probabilmente abbastanza lontano dallo snippet che mostri, un overflow del buffer o una simile memoria di memoria fuori posto che danneggia le strutture di allocazione della memoria.

Puoi provare Valgrind o Electric Fence per risolvere questi problemi.

Non so se sta causando il tuo particolare problema, ma dovresti sempre controllare il puntatore FILE * restituito da fopen() nel caso sia NULL .