free() und Speicherverwaltung



  • Guten Abend 🙂

    Mir ist da was nicht ganz klar:
    Mal angenommen ich reserviere mir Speicher mit

    unsigned char* myCharArray= (unsigned char*)malloc(sizeof(char)*1024);
    

    dann habe ich mir 1KB Speicher reserviert (auf Systemen, wo char = 1Byte groß ist). myCharArray ist ein Pointer auf den Beginn dieses Speicherbereichs (auf das erste Zeichen)

    Wenn ich jetzt

    free(myCharArray);
    

    aufrufe gebe ich den Speicher ja wieder frei, doch woher weiß er, dass ich mir 1024Byte reserviert habe? Der Pointer myCharArray zeigt doch nur auf den Anfang des Bereichs. Wie groß der ist, kann free doch gar nicht wissen.

    In dem Zusammenhang: wenn ich ein Objekt instanziiere (in einem DLL-Projekt) und exportiere es (als Handle), damit ich es in C nutzen kann, kann ich dann von C heraus mit free() arbeiten um das Objekt im Speicher wieder freizugeben?

    Danke



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89 und C99) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Mod

    PAGE_FAULT schrieb:

    unsigned char* myCharArray= (unsigned char*)malloc(sizeof(char)*1024);
    

    Warum castest du void-Pointer in C?

    dann habe ich mir 1KB Speicher reserviert (auf Systemen, wo char = 1Byte groß ist).

    Auf allen Systemen ist sizeof(char)==1. Das ist die Definition dessen, was der Wert von sizeof bedeutet. sizeof ist die Größe in Einheiten der char-Größen.

    Wenn ich jetzt

    free(myCharArray);
    

    aufrufe gebe ich den Speicher ja wieder frei, doch woher weiß er, dass ich mir 1024Byte reserviert habe?

    Die Frage beantwortet sich, wenn du dir mal überlegst, wer "er" ist. "er" merkt sich, wie viel Speicher zu diesem Pointerwert gehört.



  • Wenn malloc dir nen Pointer gibt wieso erwartest du dann das free den Pointer nicht kenn?
    Das ist ja so als ob Mutti dir nen Autoschlüssel gibt und Papi nicht wüsste wofür der ist 🤡 und du das Auto bei ihm nich abgeben darfst ...



  • Z.B können in den Bytes vor dem Speicherbereich Informationen über die Länge stehen.
    Oder sie werden in einer eigenen Liste verwaltet.



  • tut mir leid, ich bin noch anfänger. Das ist alles noch etwas verwirrend.

    Z.B können in den Bytes vor dem Speicherbereich Informationen über die Länge stehen.
    Oder sie werden in einer eigenen Liste verwaltet.

    meines wissens nach ist ein pointer (hier: myCharArray) eine information der größe eines int. diese zahl ist die speicheradresse wo ich die daten finde, auf die der pointer (durch diese information) zeigt. der pointer selbst hat auch eine speicheradresse (der muss ja auch irgendwo liegen).
    wo werden dann da die längeninformation gespeichert? der gesamte variablenbereich eines int wird doch benötigt um die adresse darzustellen

    Auf allen Systemen ist sizeof(char)==1. Das ist die Definition dessen, was der Wert von sizeof bedeutet. sizeof ist die Größe in Einheiten der char-Größen.

    wenn die immer und überall gleich sind, warum macht man dann sizeof(type)? nur weil der entwickler sich die typengröße nicht merken kann? ich bin davon ausgegangen, dass es systeme gibt, wo die größe variieren kann (z.b. dass ein int auf einem 64bit-system doppelt so groß ist)


  • Mod

    PAGE_FAULT schrieb:

    (durch diese information) zeigt. der pointer selbst hat auch eine speicheradresse (der muss ja auch irgendwo liegen).
    wo werden dann da die längeninformation gespeichert?

    Zum Beispiel ganz woanders. Der Speichermanager kann sich ja auch selber Speicher besorgen. Häüfig wird, wie dir schon gesagt wurde, die Größeninformation aber einfach direkt vor den allokierten Speicher gepackt (das heißt, malloc reserviert heimlich ein bisschen mehr und gibt dir dann aber nur einen Teil)

    Auf allen Systemen ist sizeof(char)==1. Das ist die Definition dessen, was der Wert von sizeof bedeutet. sizeof ist die Größe in Einheiten der char-Größen.

    wenn die immer und überall gleich sind, warum macht man dann sizeof(type)? nur weil der entwickler sich die typengröße nicht merken kann? ich bin davon ausgegangen, dass es systeme gibt, wo die größe variieren kann (z.b. dass ein int auf einem 64bit-system doppelt so groß ist)

    Lies genau! Ich habe bloß gesagt, sizeof(char)==1. Nichts über int oder sonstige Typen.



  • Nochmal mit BEdacht lesen: sizeof(char) ist per Definition 1.
    sizeof gibt nicht die Bytes an sondern die Speicherelemente.

    Wenn das jetzt 2 Byte sind, kann sizeof(short) auch 1 sein.
    Wie groß so ein Element ist kannst du mit dem Makro CHAR_BITS ermitteln.

    Im Standard von C sind dafür nur Mindeswerte angegeben.

    Und ein Pointer ist kein int. Und du kannst von der Größe eines int nicht auf die Größe eines Pointers schließen.

    Wo die Informationen über den dynamischen Speicher abgelegt werden ist Systemabhängig.

    Was ich mit vor dem Speicherbereich meinte ist, dass da noch Bytes benutzt werden, die vor der Adress liegen, die du von malloc bekommst.

    Du bekommst von malloc z.B. die Adresse 47110816, dann liegt die Information ab 47110810. Muss aber nicht sein.



  • PAGE_FAULT schrieb:

    tut mir leid, ich bin noch anfänger. Das ist alles noch etwas verwirrend.

    Mit K&R wäre das nicht passiert. 😉

    Im Ernst jetzt: Im K&R-Buch gibt es eine schöne Übungsaufgabe mit ordentlich Unterstützung, bei der man ein (simples) Malloc mal selbst implementiert. Zumindest mir hat das damals geholfen, dass sich solche Fragen gar nicht erst auftun. Das Durcharbeiten kann ich dir als Anfänger nur empfehlen. Viele andere Lehrbücher lassen da auch über 20 Jahre später noch viele Fragen offen.


Anmelden zum Antworten