Ich glaube, Sie nicht richtig verstanden, wie die freie Funktion funktioniert. free Ruft einen Zeiger auf die Region, die Sie für Ihre Struktur zugewiesen haben, und dann informiert das Betriebssystem, dass es kein zugewiesener Abschnitt des Speichers mehr ist. Wenn Sie zum Beispiel ein Vektor-Struktur erstellen:
typedef struct Vector2 {
float x,y;
} Vector2;
// Somewhere in an executing section of code for example you do this
Vector2 *vec;
vec = (Vector2*) malloc(sizeof(Vector2));
Inzwischen, wie Sie sagten, ist die Vector2 nur sequentielle Daten irgendwo im Speicher (wenn Sie präziser in einer Region sein wollen genannt Haufen). Wenn Sie es sehen könnten, würde es aussehen:
HEAP-MEMORY: ... | float x | float y | ...
, wenn Sie einen zugewiesenen Vector2 befreien wollen, müssen Sie einfach die kostenlose Funktion übergeben seinen Zeiger aufzurufen:
free(vec);
Dies ist das einfachste Beispiel, weil es nicht mehr Behandlung notwendig ist, anstatt Aufruf der freie Funktion. Das liegt daran, dass die Struktur Vector2 keine Zeiger hat! Wenn die Struktur ist komplexer und hat einige Zeiger, vor der Freigabe der Loch-Sache, müssen Sie müssen befreien alle ihre Zeiger. Das nächste Beispiel ist eine Listenimplementierung, bei der jeder Knoten auf den nächsten Knoten zeigt, bis der letzte Knoten auf NULL zeigt.
typedef struct Node {
int data;
struct Node* next;
} Node;
//Returns a new node
Node* newNode(){
Node* node = (Node*) malloc(sizeof(Node));
node->next = NULL;
return node;
}
//Adds new element at tail
Node* addAtTail(Node* list){
if(list->next != NULL)
return addAtTail(list->next);
list->next = newNode();
return list->next;
}
Wie die nächste Liste in Ihrem Heap-Speicher sein wird?
Node* example_list = newNode();
addAtTail(example_list);
addAtTail(example_list);
addAtTail(example_list);
Diese Liste ist die folgende Liste: A -> B -> C -> D -> NULL
Dies ist Ihr heap-SPEICHER:
... {int Daten | Knoten * next} ... {int Daten | Knoten * next} ... {int Daten | Knoten * next} ... {int Daten | Knoten * weiter} ...
Okay. Wie wird Ihr Heap-Speicher, wenn Sie nur die folgende Codezeile aufrufen: free(example_list);
? example_list
ist der "A" Knoten (der erste Knoten) daher werden Sie nur freien Knoten "A"! So lautet Ihr Heapspeicher jetzt:
... {--------- freigegeben --------} ... {int data | Knoten * next} ... {int Daten | Knoten * weiter} ...{int Daten | Knoten * next} ...
Was passiert mit all diesen Knoten, die Sie nicht freigegeben haben? : D
MEMORY LEAK ist der richtige Ausdruck dafür. Diese schlechten Daten in deinem Gedächtnis haben keine Zeiger auf sie, deshalb sind sie für immer in deinem Gedächtnis verloren und besetzen nur den Raum! In den meisten Anwendungen werden Sie keinen Unterschied bemerken, aber bei kritischen und laufenden Anwendungen ist es sehr wichtig, dass keine Anwendung zum Löschen von Speicherlecks vorhanden ist. Daher ist es sehr empfehlenswert, den Code nicht zu verlecken.
Vielleicht Rectangle_t
hat einige Hinweise, die in einer besonderen und einzigartigen Art und Weise :) Die spezielle kostenlose Funktion für unser Beispiel Liste befreit werden müssen, würde so sein:
void freeList(Node* node){
if(node == NULL)
return;
free_list(node->next);
free(node);
}
Wenn Sie nicht die Sonderfunktion rufen Sie Um den struct Node zu befreien, wird es einen Speicherverlust geben, deshalb ist es notwendig. Ich nehme an, das ist der gleiche Grund für Rectangle_t
Ja, ich verstehe 'free()' und 'malloc()'. Aber die Frage ist, in diesem Beispiel, sein * not * mf vom Typ 'struct my_figure', der freigegeben wird, * es ist * mf-> rect vom Typ Rectangle_t, der freigegeben wird. –
2.17 "In diesem Beispiel hat der Anwendungsprogrammierer eine benutzerdefinierte Struktur mit einem ASN.1- abgeleiteten Element (rect) definiert. Dieses Element ist keine Referenz auf das Rectangle_t, sondern eine In-Place Aufnahme der Rectangle_t-Struktur .Wenn das Freimachen notwendig ist, darf das übliche Vorgehen von , das alles freigibt, nicht auf den eigentlichen Zeiger selbst angewendet werden, da es nicht auf den von der Speicherzuweisungsroutine direkt zugewiesenen Speicherblock zeigt, sondern innerhalb eines zugewiesenen Blocks liegt die my_figure Struktur. " Ich denke, es ist das, was ich gesagt habe, diese Struktur braucht eine besondere Art der Befreiung –