free()

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

free()
Hallo,
Ich habe eine Frage zur Freigabe von allozierten Speicher:

Bei wsort lege ich mit malloc Speicher für ein Wort und die Liste an, mit realloc wird diese je nach Bedarf vergrößert.

Ganz am Ende, bei mir direkt vor dem “return(0)” würde ich dann nacheinander das free() aufrufen.

Mit valgrind kommt diese Meldung:

1 errors in context 1 of 3:
==6793== Invalid free() / delete / delete[] / realloc()
==6793== at 0x402D358: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6793== by 0x80488F6: main (wsort.c:127)
==6793== Address 0x4084d20 is in the Text segment of /lib/i386-linux-gnu/libc-2.21.so
==6793== at 0x4084D20: __new_exitfn (cxa_atexit.c:73)
==6793==
==6793==
==6793== 1 errors in context 2 of 3:
==6793== Conditional jump or move depends on uninitialised value(s)
==6793== at 0x402D31B: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==6793== by 0x80488F6: main (wsort.c:127)

Muss ich bei dem free noch was beachten?


Was meinst du mit “nacheinander das free() aufrufen”? Am Ende darfst du fuer den vergroesserten Speicherbereich nur exakt einmal ein free() aufrufen. Wenn du das mehrmals tust, oder nicht auf die Addresse aus dem letzten realloc() dann explodieren Dinge.


[m]Invalid free()[/m] heißt, dass du einen Pointer [m]free[/m]-en willst, an dem du entweder nie etwas allokiert hast oder der bereits ge-[m]free[/m]-t wurde. Wenn du [m]realloc[/m] immer auf den letzten von [m]realloc[/m] zurückgegebenen Pointer (der kann sich ändern!) ausführst, dann musst du auch genau diesen am Ende an [m]free()[/m] übergeben.


Ok danke,

bei mir ist der Programmablauf ca. so:
ich lege mit malloc Speicher für ein Wort an
dann malloc für **char(meine Liste)
und dann noch falls das Array vergrößert werden muss, das realloc für **char.

Ich verstehe noch nicht ganz genau, wie oft ich free() ausführen muss.
z.B. das malloc für ein Wort ist in einer while-Schleife und weißt, soweit ich verstanden habe, jedem Wort aus der stdin den Speicher auf dem Heap zu.
Muss ich dann das free nur einmal ausführen? also z.B. free(word); word ist bei mir char*
Das free (word) kann ich dann erst nach der Ausgabe mit printf machen?


[m]free(word)[/m] bedeutet: das Speicherstück an Stelle [m]word[/m], welches ich vorhin angefordert habe und mir noch zugeteilt ist, brauche ich nicht mehr

[m]printf(„%s“, word)[/m] bedeutet: lese vom Speicherstück an der Stelle [m]word[/m] und gebe es aus

PS: Warum [m]printf(„%s“, word)[/m] und nicht [m]printf(word)[/m]? Probiere aus, was passiert, wenn deine Datei eine Zeile wie [m]%s%d%s%d%s%d[/m] enthält (ggf. mit [m]valgrind[/m] testen).