2017-05-01 2 views
-1

Ich muss frei() all den Speicher für meine Strukturkonfiguration zugewiesen.Ich kann nicht herausfinden, wie man meine Struktur frei

struct keysnvalues { 
char* key; 
char* value; 
}; 

struct section { 
char *name; 
struct keysnvalues *keysnvalues; 
int keysnvalues_ammount; 
}; 

struct config { 
struct section *sections; 
int section_ammount; 
}; 

Im beggining des Codes kann ich diese

struct section * sect = malloc(sizeof(struct section) * 255); 
struct keysnvalues * keysnvalue = malloc(sizeof(struct keysnvalues) * 255); 

Wenn ich Abschnitt hinzugefügt werden soll ich tun dies für die erste

sect[++num_section].name = buffer; // buffer is the name 

Und für die nächsten Abschnitte

sect[num_section].keysnvalues = keysnvalue; 
sect[num_section].keysnvalues_ammount = num_keysnvalues; 
cfg -> section_ammount++; 

      //start with new keysnvalue 
num_keysnvalues = 0; 
keysnvalue = malloc(sizeof(struct keysnvalues) * 255); 
sect[++num_section].name = buffer; 
sect[num_section].keysnvalues = 0; 

Wenn ich will einen Schlüssel und einen Wert Abschnitt füge ich mit ich dies tun

keysnvalue[num_keysnvalues].key = key; 
keysnvalue[num_keysnvalues++].value = value; 

Der gesamte Code ist hier arbeite: https://pastebin.com/pGztJ9k4

Ich bin der Tatsache bewusst, dass dies wahrscheinlich eine dumme Frage, aber ich konnte nicht herausfinden, wie man jetzt die ganze Strukturkonfiguration für Stunden freigibt.

Ich würde Ihre Hilfe wirklich schätzen.

+0

'frei (keysnvalue);'? –

+3

Ich vermute, es gibt eine Menge mehr als nur diesen Code. Etwas sagt mir 'Schlüssel'."Wert" und "Name" sind ebenfalls dynamisch, und das Management von * all * ist wesentlich stärker involviert als die hier dargestellte Trivialisierung. Ungeachtet dessen gibt die [Dokumentation für 'free()'] (http://en.cppreference.com/w/c/memory/free) gute Einsichten darüber, wie/wann sie zu verwenden ist. – WhozCraig

+0

@WhozCraig Aber wenn ich malloc nicht auf Abschnitt [i] .name anrufe, sollte ich gerade frei (Abschnitt [i]) in Ordnung sein, oder? – Martin

Antwort

1

Im Allgemeinen sollten Sie free() einen Zeiger, wenn und nur wenn es durch malloc() zugewiesen wurde. Um dies zu erreichen, müssen Sie sicherstellen, dass kein Zeiger auf eine malloc Ed-Speicheradresse, z. indem Sie der gleichen Variablen mehrmals malloc zuweisen, ohne den vorherigen Wert kopiert zu haben oder ohne den zuvor zugewiesenen Speicher freigegeben zu haben.

Ich habe den vollständigen Code, auf den Sie sich beziehen, nicht analysiert. Aber es scheint, als ob Sie den Wert keysnvalue in den aktuellen Abschnitt vor malloc einen neuen Wert für sect[i].keysnvalues kopieren. Daher scheint es, dass jeder Abschnitt des keysnvalue seine eigene, und Sie können es Schleife durch:

for (int i=0;i< num_section;i++) { 
    if (sect[i].keysnvalues != NULL) { 
     free(sect[i].keysnvalues); 
     // free(sect[i].name); // if buffer has also been malloced 
    } 
} 
free (keysnvalue); 
free (sect); 

Es kann sein, dass Sie auch jede sect[i].keysnvalue um Schleife Trog müssen schließlich frei key/value.

Stellen Sie sicher, dass der Abschnitt Mitglieder, die Sie free am Ende des Programms gehen werden einen Müllzeigerwert immer initialisiert entweder mit NULL oder einem malloc ed Wert, um aus dem Code zu verhindern „zu befreien“.

0

Wenn Sie 'keysnvalue' mit dem nächsten 'malloc()' zurücksetzen, sind Sie , den Zeiger auf den vorherigen Wert von 'keysnvalue' überschreiben. Dadurch ist der zugehörige Speicher nicht erreichbar, d. H. Ein "Speicherverlust" [es sei denn, Sie behalten eine Kopie des vorherigen Werts von 'keysnvalue' an einem anderen Ort bei]. Wenn du die Struktur wirklich durch eine neue ersetzt, musst du zuerst die alte "befreien" und dann "malloc()" die nächste - du kannst nicht bis zum Ende warten, um alles aufzuräumen.

Persönlich würde ich es nicht so machen - für eine frische Struktur würde ich "memset()" nennen, um die bestehende Struktur auf Null zu setzen.

+0

Also im Grunde durch Aufruf von "keysnvalue = malloc (sizeof (struct keysnvalues) * 255);" Immer wenn ich einen Keysnvalue in einen Abschnitt einfügen möchte, mache ich es unmöglich, es freizugeben()? – Martin

Verwandte Themen