Fehler in " ein.out': free(): invalid next size (normal)

Schreibe ich eine große Anwendung, und ich vor kurzem aufgenommen da mein neues Modul für die Arbeit mit Dateien. Er hat einfache Funktionen schreiben, die Integer-zahlen und strings, es wurde getestet, um perfekt auf Red Hat. Es tut genau das, was ich will.

Hier ist die Implementierung der Funktionen gibt es:

int CFile_open(CFile* owner, char* filename, char* mode) {
    owner->file = fopen(filename, mode);
    if (owner->file == NULL) {
        return 0;
    } else {
        return 1;
    }
}

int CFile_close(CFile* owner) {
    if (owner->file == NULL) {
        return 0;
    } else {
        if (fclose(owner->file) ) {
            return 1;
        } else {
            return 0;
        }
    }
}

int CFile_writeInt(CFile* owner, int num) {
    if (owner->file == NULL) {
        return 0;
    } else {
        if (fwrite(&num, sizeof(int), 1, owner->file)) {
            return 1;
        } else {
            return 0;
        }
    }
}

int CFile_writeString(CFile* owner, char* str) {
    if (owner->file == NULL) {
        return 0;
    } else {
        char b = strlen(str);
        if (fwrite(&b, sizeof(char), 1, owner->file)) {
            for (int i=0; i<=b; i++) {
                fwrite(&str[i], sizeof(char), 1, owner->file);
            }
        } else {
            return 0;
        }
    }
}

Diese Funktionen genutzt werden, die in der wrapper-Funktion dann ausgeführt wird in meiner Anwendung.
Hier ist die Funktion:

void fileWrite(void* data) {
    CList* list = (CList*)data;
    CNode* node = list->first;
    CData* info = NULL;
    CFile* f = (CFile*)malloc(sizeof(CFile));
    f->init = CFile_init;
    f->init(f);

    if (list->length == 0) {
        printf("%s\n", "The list is empty!");
        wait();
    } else {
        int i = 1;

        if (f->open(f, (char*)"./f", (char*)"w")) {
            while (node) {
                info = node->getData(node);

                if (f->writeInt(f, info->getNum(info))) {
                    if (f->writeString(f, info->getAdr(info))) {
                        if (f->writeString(f, info->getPh(info))) {
                            printf("%s%d\n", "Wrote item #", i);
                            i++;
                        } else {
                            printf("%s%d\n", "Error writing Phone of item #", i);
                        }
                    } else {
                        printf("%s%d\n", "Error writing Adress of item #", i);
                    }
                } else {
                    printf("%s%d\n", "Error writing Number of item #", i);
                }

                node = node->next;
            }
            if (f->close(f)) {
                printf("%s\n", "Wrote successfully");
                wait();
            }
        }
        free(f);
    }
}

Die problematische Stelle ist die f->close(f) ganz am Ende der Funktion.
Wenn ich nicht schließen Sie die Datei, funktioniert alles einwandfrei. Aber wenn ich das Tue, bin ich immer die folgende Fehlermeldung:

*** Error in 'a.out': free(): invalid next size (normal): 0x0859c320 ***

Jedoch trotz der Anwendung abstürzt, tut es die Datei schließen und die info, die ich schrieb, um es korrekt und nicht beschädigt sind.

Aber ich kann nicht herausfinden, warum bin ich immer die Fehler. Schließe ich die Datei nur einmal (wie Sie sehen können aus der Funktion), und ich habe auch versucht zu kommentieren die free(f) Linie.
Auch wenn ich den Anruf fclose(f->file) dort bekomme ich den gleichen Fehler, also ist das nicht die close() Funktion Ausgabe.

Ich gehe davon aus, dass der rest der Anwendung funktioniert (und funktionierte, bevor ich noch die Funktion) perfekt, außer für die Zeile, wo ich die Datei schließen.

Der Grund, warum ich erwähnt RedHat ist, weil es perfekt funktionierte es, aber wenn ich neu kompiliert unter ArchLinux (habe auch versucht Debian) - es wird nicht schließen Sie die Datei. Gleichen compiler-Versionen wurden überall verwendet.

Compiliere ich es mit g++ wenn das wichtig ist, aber ich habe auch das gleiche Problem mit clang++.

Ich auch versucht, läuft es mit valgrind und es sagt nichts über die Dateien, oder ich konnte einfach nicht finden die richtigen Tasten. Vielleicht wissen Sie das?

Also, habt Ihr irgendwelche Ideen auf, was Los ist und wie es zu lösen ist? Ich starrte auf den code, der für buchstäblich 3 Stunden schon und ich kann nicht herausfinden, für das Leben von mir.


Test-Fall:

info->getNum() returns integer "11" (zugewiesen, während input)
info->getAdr() Renditen dynamisch vergebene char-array "aa" (allokiert und zugewiesen, während input)
info->getPh() Renditen dynamisch vergebene char-array "bb" (allokiert und zugewiesen, während input)

Kann ich testen, diese Werte mit anderen Funktionen in meiner Applikation, also ich bin 100% zuversichtlich, dass Sie korrekt sind.

Dann habe ich Sie eben erinnern an die fileWrite() Funktion.

Präsentieren Sie Ihre testcase.
Es ist schwer zu deuten, etwas sinnvolles, ohne zu sehen, was die CFile member-Funktionen zu tun.
Bearbeitet die Frage. Ich weiß nicht, ob das helfen würde, da die einzigen Dinge, die ich bin immer von außerhalb der Funktion sind die Werte, die ich überprüfen kann und ich bin mir sicher, dass Sie korrekt sind.
R Sahu, der CFile Funktionen aufgelistet sind, in die erste code-block der post.
Was ist, wenn Sie kommentieren, while-Schleife, so dass nur noch das öffnen und schließen der Datei?

InformationsquelleAutor ohyou | 2014-10-30

Schreibe einen Kommentar