Oder mit Referenzzählung.
Referenzzählung = Beim Anlegen und darauf verweisen wird der Zähler erhöht. Beim Entfernen eines 'Childs' wird der Zähler des Parents erniedrigt. Wenn der Zähler bei 0 ist, ist der Knoten nicht mehr in Verwendung => Löschen => Rekursiver Aufruf.
Oder gleich mit Interfaces arbeiten, die haben das nämlich eingebaut.
Bei 4 Mio Knoten würde ich allerdings alle Knoten von Anfang an in einer Liste verwalten (TObjectList). Im Konstruktor und Destruktor eines Knotens baust Du einfach eine einzige Zeile ein:
Delphi-Quellcode:
Constructor TMyNode.Create;
Begin
...
ListOfNodes.Add(Self);
End;
Destructor TMyNode.Destroy;
Begin
...
ListOfNodes.Remove(Self);
End;
Class Procedure TMyNode.KillAllNodes;
Begin
ListOfNodes.Clear;
End;
initialization
ListOfNodes := TObjectList.Create(True);
finalization
KillAllNodes; // Hier eigentlich überflüssig, aber anschaulich.
ListOfNodes.Free
End.
Leider ist die TObjectList nicht sonderlich schnell, sodaß eine Dictionary hier sicherlich besser geeignet wäre.