2016-09-01 4 views
0

freizugeben Ich verwende eine Funktion, die eine bestimmte Anzahl von Bytes vom Benutzer reserviert, und dann habe ich eine andere Funktion, die den Speicher freigeben soll, die zugewiesen wurde. Das Speichersegment dient als Pool, der x Listenknoten gleicher Größe enthält.Fehler beim Versuch, eine vorherige malloc

Anfangs Funktion:

void create_mem(int mem_size, int num_n){ 
    number_of_nodes = num_n; 
    mem_block = malloc(mem_size); 
    header = mem_block; 
} 

Die Header-Datei hat number_of_nodes, Kopf- und mem_block als int, list_node * und char * sind.

Ich habe auch eine list_node Struktur in der Header-Datei:

typedef struct list_node { 
    list_node* next; 
}list_node; 

Die Löschfunktion:

void delete_mem(){ 
    free(mem_block); 
} 

Die Liste funktioniert und mein Code enthält insert_nodes und delete_nodes, die gut funktionieren, aber wenn mein main ruft die Funktion delete_mem auf, mein Programm stürzt ab.

Wenn ich die delete_mem Funktion geändert:

void delete_mem(){ 
    mem_block = NULL; 
    free(mem_block); 
} 

bekomme ich keine Fehler

, aber ich glaube nicht, das tatsächlich löschen Funktion tut, was ich will es tun.

Ich glaube, ich muss alles löschen, das in diesem ursprünglichen mem_block ist, bevor ich versuche, den Speicher freizugeben, aber ich bin mir nicht sicher, wie ich das machen soll.

+4

Nicht genügend Informationen. Bitte poste ein [mcve]. – kaylum

+0

Offensichtlich, wenn Sie 'mem_block = NULL' zuweisen, dann ist das folgende' free() 'äquivalent zu' free (NULL) ', was nichts tut. –

+0

Beste Vermutung: Irgendwo (sonst) vergeben Sie einen neuen Wert für 'mem_block', so dass, wenn Sie versuchen, es freizugeben, sein Wert nicht mehr der Wert ist, der von' malloc() 'empfangen wurde. –

Antwort

0

Stellen Sie sicher, dass der Wert von mem_block nach malloc nicht geändert wurde.

wenn es der Ruf free(mem_block); Willen in Schwierigkeiten geändert,

2

Sie es rückwärts tat. NULL Wenn Sie die Variable zuerst anzeigen, bedeutet dies, dass Sie den Speicher auslaufen lassen, dann free(NULL). free(NULL) ist legal, aber es ist ein No-Op; Es ist zu spät, um das Leck zu beheben, da Sie den Zeiger verloren haben. Verwendung:

void delete_mem(){ 
    free(mem_block); 
    mem_block = NULL; 
} 

zu free zuerst, dann NULL aus.

Ich weiß nicht, was in mem_block sein könnte, aber wenn es Hinweise auf andere zugewiesenen Speicher enthält, dann würden Sie brauchen einen depth-first Traversal jeden Zeiger (n) es „gehört“ zu tun, free die ing äußere "Blätter", bevor Sie Ihren Weg zurück zu den "Gliedmaßen", so dass Sie nicht free Speicher, bis alle Zeiger darin gespeichert wurden auch free -ed.

Verwandte Themen