2011-01-15 11 views
2

Es gibt eine ähnliche Frage here.Freier Speicher einer Struktur mit zwei Datenfeldern

Ich habe die folgende Struktur:

struct SimpleXY 
{ 
    double x; 
    double y; 

}; 

struct SimpleEdge 
{ 
    SimpleXY first; 
    SimpleXY second; 
} 

    struct SimpleEdgeList 
    { 
      uint num_edges; 
      SimpleEdge *SimpleEdges; 
    }; 

Was ist der richtige Weg, um den Speicher hält, durch SimpleEdgeList zu befreien? Dies ist mein derzeitiger Ansatz, aber ich frage mich, ob ich das Datenfeld first und second manuell freigeben sollte oder nicht.

void Free(SimpleEdgeList *myList) 
{ 

    free(myList->SimpleEdges); 
} 

Dies ist eine Struktur C und ich bin für eine C wie Speicher frei suchen.

+0

Soll das eine verkettete Listenimplementierung sein? Wenn das der Fall ist, sollten Sie 'struct SimpleEdgeList {int num_xy; SimpleEdgeList * weiter; }; ', und die' Free() 'Funktion wird ein wenig mehr beteiligt sein. –

+2

Eine 'struct' mit einem Member mit dem gleichen Namen ist sehr verwirrend. Bitte tu das nicht. –

+0

@Chris, es ist * nicht * eine Linkliste. Meine Struktur ist korrekt. Aber ich bearbeite den Mitgliedsnamen zur Klarstellung – Graviton

Antwort

5

Sie müssen die Felder nicht manuell freigeben. Wenn Sie den von myList->SimpleEdgeList referenzierten Speicher freigeben, bereinigt der Aufruf von free() den gesamten Speicherblock, einschließlich der zwei von Ihnen erwähnten Felder. Da diese Felder keine Zeiger auf andere Objekte enthalten, müssen Sie nicht in die Felder zurückkehren, um Speicher freizugeben.

4

Ihr aktueller Ansatz ist in Ordnung.

Die einfache Regel ist dies genau ein free() für jeden malloc() erforderlich ist. Da Sie nur eine malloc() haben, benötigen Sie nur eine free().

Verwandte Themen