Verständnisproblem zu calloc und free
-
Hey,
ich les mich grad in C und in C++ ein. Zur Zeit bin ich bei der dynamischen Speicherverwaltung und bin dabei auf die Methoden calloc und free gestoßen. calloc liefert ja einen Zeiger auf das 1. Element des reservierten Speichers. Das hab ich soweit verstanden, aber ich versteh nich, wie free wissen kann wiviel Speicher er freigeben soll, wenn er nur den Pointer bekommt. Gibt es da sowas wie ein terminierendes Zeichen oder Speichert er irgendwo die reservierten Speicherblöcke? Wäre toll, wenn mir das jmd erklären kann.
MfG & Thx Bergmann.
-
das ist der Implementierung (d.h. dem Compiler und dem Betriebssystem) überlassen und braucht dich eigentlich nicht interessieren. Im Grunde kannst du dich drauf verlassen dass wenn du ein free auf einen von malloc (calloc?) gelieferten Pointer aufrufst, der komplette dazugehörige Speicher wieder freigegeben wird.
Daher die kurze Antwort: Who cares
Lange Antwort: Häufig wird das so gemacht, dass der tatsächlich angeforderte Speicherblock ein bisschen größer ist (meist 4 Byte). In diesen 4 yte steht dann drin wie groß der Block ist, der Pointer verweist auf den Rest des Bereichs. Beim Aufruf von free wird dann geschaut, was in den 4 Byte vor dem übergebenen Pointer steht und der entsprechende Bereich freigegeben.
Aber: das ist wie gesagt nirgendwo definiert und nur eine von vielen Möglcihektien, sowas umzusetzen. Verlass dich nicht drauf und versuch vor allem nicht, die die 4 Byte davor anzuschauen, das wäre nämlich undefiniert. (Das Wörtchen undefiniert bzw. undefiniertes Verhalten heißt so viel wie "Hölle", "Finger weg" und "Es könnten jetzt kleine grüne Männchen aus deinem Rechner steigen und dich in die Sonne schießen...")PS: malloc/calloc/free ist C. Der pendant in C++ wäre new/delete und new[]/delete[].
-
Hey,
danke für die Antwort. Ich hab mich nur gewundert bzw. gefragt ob die Freigabe dann auch richtig is. Aber meine Bedenken hast du ja jetz befriedigend vernichtet
Danke.MfG & Thx Bergmann.
p.s.: calloc = malloc + Initialisierung des Speichers mit 0en
-
p.s.: calloc = malloc + Initialisierung des Speichers mit 0en
Jopp - auch hier nachzulesen.
sollte so und so deine erste anlaufstelle sein, wenn du fragen zur standard lib hast
-
Jo,
die Seite kenn ich schon, guck ich auch immer als erstes, weils da auch immer guten Bsp-Code gibt...
Hab noch ne kleine Frage. Is zwar offtopic, aber ich will jetzt deswegen nich extra n Thread aufmachen: Gibts hier sowas wie beobachtete Themen? Also Themen die ich abonnieren kann?MfG & Thx Bergmann
-
irgendwann gabs glaube ich mal so ne fkt., dass man benachrichtigt wurde (aber nur, wenn man nen eigenen thread aufgemacht hatte!?) - aber ich glaub, das wurde ganz rausgenommen...
das müsstest du mal im forentechnik-thread fragen...
bb
-
Bergmann89 schrieb:
Gibts hier sowas wie beobachtete Themen? Also Themen die ich abonnieren kann?
Rechts unten "Bei Antworten zu diesem Thema benachrichtigen"
-
Ich denke es ist doch eher so dass der Kernel Informationen zu den einzelnen Heap-Blöcken speichert, da wird höchstwarscheinlich auch die Größe dabei sein.
-
Icematix schrieb:
Ich denke es ist doch eher so dass der Kernel Informationen zu den einzelnen Heap-Blöcken speichert, da wird höchstwarscheinlich auch die Größe dabei sein.
Kommt drauf an, wie gesagt. Durchaus möglich, dass die Anforderungen direkt an den Kernel gehn, genausogut denkbar, dass es einen eigenen Speichermanager gibt, der vom Kernel größere Blöcke anfordert und die für die einzelnen Speicheranforderungen nochmal zerpflückt. Und der könnte es so handhaben wie beschrieben. Oder ganz anders. Ist Betriebssytsem- und Compiler-abhängig und für den Entwickler die meiste Zeit irrelevant, wenn er nicht grade in höchsten -Nöten steckt und aus solchen Details noch einzelne Bits rauskitzeln muss.