Fehlermeldung glibc detected



  • Hallo zusammen!

    Folgendes Problem:
    Ich habe ein Programm geschrieben, dass mir aus verschiednen Sequenzsätzen die "Ähnlichkeit" berechnet. Bei drei Sequnenzsätzen lief es wunderbar, nur bei dem letzten kam die Fehlermeldung "Speicherzugriffsfehler", also habe ich mit "malloc" alle wichtigen großen Arrays allokiert, und es lief auch für den letzten Datensatz wunderbar durch.
    Wenn ich es jetzt aber mit den vorherigen Datensätzen teste, dann bekomme ich einmal die Fehlermeldung: "*** glibc detected *** double free or corruption (out): 0x08078a68 *** Abgebrochen" und zum zweiten "*** glibc detected *** corrupted double-linked list: 0x08060028 *** Abgebrochen"
    Meine Frage: Wie kann das passieren, und wie kriege ich das Problem wieder behoben?

    Danke für die Hilfe!



  • Hallo,

    vermutlich wendest du zweimal free auf den selben Speicherbereich an. Bitte zeig ein bisschen Code, damit wir dir helfen können 🙂

    MfG

    GPC



  • Gut, also hier erst mal die Stellen, wo ich den Speicher breitstelle:

    dinta = (int ***) malloc (len * sizeof(int **));
    	for (i=0; i<=len; i++) {
    	  dinta[i] = (int **) malloc (len * sizeof(int*));
    	}
    	for (i=0;i<=len;i++) {
    	for(j=0;j<=len;j++) {
    		dinta[i][j] = (int *) malloc (bp * sizeof(int));
    	}
    	}
    ...
    
    cov_values = (float *) malloc (len_square * sizeof(float));
    

    Und hier gebe ich den Speicher wieder frei:

    for (i=0;i<=len;i++) {
    	for(j=0;j<=len;j++) {
    	free(dinta[i][j]);
    	}
    	free(dinta[i]);
    	}
          free(dinta);
          free(cov_values);
    

    Hilft das weiter?

    Wenn es bei allen Datensätzen nicht funktionieren würde, dann würde ich es ja noch verstehen, aber bei zweien läuft alles einwandfrei, und bei den beiden anderen kommt es zu den o.g. Fehlermeldungen...



  • Hallo,

    also auf den ersten Blick dachte ich, du gibst falsch frei, aber ich habe mich getäuscht. Das einzige was mir auffiel, ist die Tatsache, dass du immer <=len iterierst, anstatt <len, ist kein Fehler, aber hat mich irritiert 😉

    Aufgrund der spärlichen Infos und den etwas unsprechenden Variablennamen (was ist bp?) kann ich dich nur an den Debugger verweisen. Vllt. findest du den Fehler auch, wenn du deine Allokations - und Deallokationsfunktionen auslagerst. Tut mir leid.

    MfG

    GPC



  • GPC schrieb:

    also auf den ersten Blick dachte ich, du gibst falsch frei, aber ich habe mich getäuscht. Das einzige was mir auffiel, ist die Tatsache, dass du immer <=len iterierst, anstatt <len, ist kein Fehler, aber hat mich irritiert 😉

    Doch, das dürfte schon der Fehler sein - mit malloc wird genug Speicher für 'len' Elemente reserviert und anschließend 'len+1' Elemente darein gepackt. (und damit könnten sich in der nächsttieferen Ebene die genutzten Speicherbereiche überschneiden, je nachdem WIE malloc den Speicher verwaltet)



  • Hallo!

    Danke für eine Antwort, aber ich habe den Fehler mittlerweile gefunden.
    Das Problem war wohl, dass ich das Array cov_values in einem Array mit Werten fülle, ich bei dem Auffüllen wohl immer ein Feld weitergehe, als ich Speicher reserviert habe; das habe ich jetzt geändert und nun läuft es.
    Das bp steht für Basenpaare und ist "6"

    Wie gesagt, nochmals danke und ein Schönes Wochenende!


Anmelden zum Antworten