Die schnelle Antwort ist, dass Perl 5 nicht behandelt kreisförmige Referenzen automatisch. Sofern Sie keine expliziten Maßnahmen in Ihrem Code treffen, werden alle Ihre Datenstrukturen, die Zirkelbezüge enthalten, nicht zurückgenommen, bis der Thread, der sie erstellt hat, stirbt. Dies wird als ein akzeptabler Kompromiss angesehen, da es die Notwendigkeit einer Laufzeit-Speicherbereinigung vermeidet, die die Ausführung verlangsamen würde.
Wenn Ihr Code Datenstrukturen mit Zirkelverweisen erstellt (dh eine Baumstruktur, deren Knoten Verweise auf den Stamm enthalten), sollten Sie das Scalar :: Util-Modul verwenden, um die Referenzen zum Stamm zu "schwächen" Knoten. Diese schwachen Referenzen werden nicht zum Referenzzähler dessen, worauf sie zeigen, hinzugefügt, so dass die gesamte Datenstruktur automatisch freigegeben wird, wenn die letzte externe Referenz verschwindet.
Beispiel:
use Scalar::Util qw(weaken);
...
my $new_node = { content => $content, root => $root_node };
weaken $new_node->{root};
push @{$root_node->{children}}, $new_node;
Wenn Sie Code verwenden, wenn Sie neue Knoten zu Ihrer Datenstruktur hinzufügen, dann die einzigen Hinweise auf die Wurzel, die tatsächlich gezählt werden, sind solche von außerhalb der Struktur. Das ist genau was du willst. Dann werden die Wurzel und rekursiv alle ihre untergeordneten Elemente zurückgeholt, sobald die letzte externe Referenz darauf verschwindet.
Nit: Perl 5 verwendet Referenzzählung. Das ist ein Speicherbereinigungsschema. – tsee
OK, ich habe den Verweis auf Perl 6-Speicherbereinigung geändert. –
Danke für die Aktualisierung der Antwort. NB: Steckbare Müllsammler scheinen eine schreckliche Idee zu sein. Eine gute Möglichkeit, Dinge zu verlangsamen und/oder dubiose Aktionen aus der Ferne zu erzeugen, wenn man Müllsammler anpackt, die unterschiedliche Versprechungen bezüglich der GC-Zeit machen. – tsee