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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Auf den ersten Blick:
In
CFile_writeString
es gibt ein off-by-one-Fehler.for (int i=0; i<=b; i++)
Abbrechen sollte beii<b
. Die&str[b]
führt zu undefiniertem Verhalten.BTW, Ergebnis-Typ
strlen
istsize_t
, nichtchar
.Ich weiß nicht, ob das die Ursache für dein problem, aber.
Versuchen Sie die Kompilierung mit
-Wall -Wextra
zu nutzen, compiler Diagnose und beheben Sie alle Warnungen. Wenn das immer noch keine Lösung für das Problem zu reduzieren versuchen, den test bei einem minimal-Beispiel benötigt, um das problem zu reproduzieren (siehe http://stackoverflow.com/help/mcve).Ich habe gesehen, Ihr Beitrag über reddit und hatte einen Blick auf https://bitbucket.org/owyou/simplebd. Ein zusätzliches Problem: Sie reserve-Speicherplatz für 5 Menüpunkte, sondern rufen Sie
CMenu_addItem
6-mal, was in einem anderen (off-by-one-Zugriff aufowner->list[len]
.Die Festsetzung der mit der Liste eliminiert den Fehler. Vielen Dank für bemerken. Ich bin immer verwirrt über die array-Indizes, wenn ich Sie auch behandeln müssen, die Eingabe des Benutzers.
Ich habe ein ähnliches problem, überprüft die Antwort und fand heraus, ich habe auch ein ähnliches boundary Problem. Danke Jungs
InformationsquelleAutor C-B