Speicherfreigabe bei verschachtelten Konstrukten?
-
Hallo,
ich hab folgendes Problem. Ich hab hier eine weit verzweigte Strukturkette (man könnte es auch Baum nennen). Ein kleines Beispiel um es anschaulicher zu machen:
struct root { struct nodeType1* node; }; struct nodeType1 { struct nodeType2* node; }; struct nodeType2 { struct nodeType3* node; }; usw.
In meiner Applikation hab ich nun einen Pointer auf root. Wenn ich jetzt den Speicher von root frei geben will, muss ich ja zunächst alle Pointer in den tieferen structs frei geben um keine Speicherlöcher zu produzieren. Jetzt meine Frage: Gibt es eine Technik oder eine C/C++ Mechanik, die das für mich erledigt/erleichtert, oder muss ich wirklich händisch den gesamten Baum hinuntersteigen und alles von Hand erledigen?
Auf die structs habe ich leider keinen Einfluss, die kommen von einer anderen Bibliothek.
-
BugJoe schrieb:
Jetzt meine Frage: Gibt es eine Technik oder eine C/C++ Mechanik, die das für mich erledigt/erleichtert, oder muss ich wirklich händisch den gesamten Baum hinuntersteigen und alles von Hand erledigen?
du musst zu Fuss alles machen, wobei ich für jede Struktur eine free Funktion schreiben würde, dann sieht es so aus
void free_NodeTypeN(sruct NodeTypeN *node) { free(node); /* + weitere Code für die Freigabe */ } /* für 0 < I < N */ void free_NodeTypeI(struct NodeTypeI *node) { free_NodetypeI+1(node->node); /* + weitere Code für die Freigabe */ }
das Blöde ist, dass du N Funktion brauchst.
Eine Lösung wäre der Einsatz von einem Garbage Collector wie Hans Boehms GC zu verwenden, aber wenn die Bibliothek eigene Speicherverwaltung macht, dann wird dir das vielleicht nix bringen.
-
das Blöde ist, dass du N Funktion brauchst.
Oder nur eine mit void* und die Zeiger casten.
-
supertux schrieb:
Eine Lösung wäre der Einsatz von einem Garbage Collector wie Hans Boehms GC zu verwenden
mit so'nem stokelkram würde ich gar nicht erst anfangen.
^^man könnte z.b. eine verkettet liste bemühen, also eine funktion schreiben 'my_linked_malloc()', die alle blöcke in eine liste einträgt. wenn man dann alles wieder loswerden will, könnte man 'ne funktion aufrufen, die alle einträge der liste 'free'd'.
-
fricky schrieb:
mit so'nem stokelkram würde ich gar nicht erst anfangen.
Ich hab mir auch etwas in der Art gedacht.
Wenn wir einen GC wollten, würden wir doch nicht C nehmen, oder?oder muss ich wirklich händisch den gesamten Baum hinuntersteigen und alles von Hand erledigen?
Sollte aber sehr einfach sein, wenn man nicht aus Prinzip alle Rekursion verweigert.
So wie ich das verstanden habe, könntest du dir auch frickys Liste sparen.
Such mal nach "tree traversal".
-
Das Problem an der Sache ist, es ist zwar von der Struktur her ein Baum, aber so ziemlich jeder Knoten in diesem "Baum" ist ein anderer Typ (unterschiedliche structs).
-
Das Problem an der Sache ist, es ist zwar von der Struktur her ein Baum, aber so ziemlich jeder Knoten in diesem "Baum" ist ein anderer Typ (unterschiedliche structs).
Ich persönlich finde das unpraktisch.
Für meine Programme würde ich einen generischen Typ verwenden, der irgendeine
Information über den Typ der Kinder speichert.
Überleg dir mal, ob es nicht einfacher geht.Thus spake the master programmer:
``When the program is being tested, it is too late to make design changes.''
-
Wie gesagt, ich kanns leider nicht ändern, da die Struktur nicht von mir kommt, sondern von einer Bibliothek. Mir gefällt das auch nicht
-
Hatte ich übersehen.
Mach's wie es fricky vorgeschlagen hat, das ist ganz einfach und effektiv.
-
OK, Lösung gefunden und sie ist auch noch super easy
Die Bibliothek von der die Strukturen kommt, stellt auch Methoden zur Verfügung den Speicher wieder frei zu geben.
EDIT: Aber trotzdem vielen Dank für eure Lösungsvorschäge!
-
RTFM
-
bgdnoy schrieb:
das Blöde ist, dass du N Funktion brauchst.
Oder nur eine mit void* und die Zeiger casten.
das würde aber nur gehen, wenn alle structs der Form
struct XXX { struct YYY *node; };
sind. Wenn aber alle so geschrieben sind, dann kann man sich alle structs sparen und gleich
void *node
deklarieren. Also bestehen die structs nicht nur aus 'node', damit müsste man zwangsläufig für jeden Structs eine Free Funktion haben. Und das scheint auch die Bibliothek zu machen.