"Jens Puruckherr" jpuruckherr@cyberport.de writes:
Also, wenn ich nach
$a->b($b)
ein undef $b mache, existiert es dennoch als Teil von $a.
Ja. (Vorausgesetzt, Du weist es in der Funktion b() tatsächlich irgendeiner Variablen o.ä. zu, klar. Aber davon gehen wir ja alle aus.)
Ein undef $a räumt dann restlos auf.
Nicht zwangsweise unmittelbar. Die Entscheidung trifft der Garbage-Collector. Ich weiß nicht, wie genau das Teil bei Perl arbeitet.
Eigentlich sollte es also schon so funktionieren, aber da gibt's sicher noch subtile Ausnahmemöglichkeiten, die Dein Problem erklären können, falls es noch immer besteht.
Das Grunddilemma sind z.B. rekursive Datenstrukturen. Bei denen mußt Du AFAIK nachhelfen.
Habe ich das so richtig kapiert? Da ich alle Unterobjekte immer in einem Hauptobjekt mit durch die Klassen hiefe, wäre das wohl dann der schlaue Weg, zum Schluss sauber aufzuräumen?
- Unterobjekt erzeugen
- in Haupobjekt referenzieren
- Unterobjekt zerstören
- zum Schluss Hauptobjekt zerstören
Eigentlich genau nicht. :-)
Genau das soll der Garbage Collector eigentlich übernehmen, dazu ist er ja da. Das Zerstören von $a sollte reichen. Sonst wäre es C-like und für Perl-Geschmack viel zu mühselig.
Es wäre aber eine Methode zum Aufräumen, falls Du Dir eine rekursive Datenstruktur im Speicher aufgebaut hast, die der Garbage Collector beim Suchen nach Müll nicht erkennt. Wenn Dein $a und $b irgendwie nicht so trivial sind, wie es in dem Minimalbeispiel scheint.
Ob so ein Konstrukt bei Dir vorliegt, müßte man genauer untersuchen.
Im letzten Abschnitt von
http://www.perldoc.com/perl5.8.0/pod/perlobj.html
steht bissel was zu dem Thema und es gibt dort Hinweise auf die weiterführenden Perl-Manuals.
Eine Alternative wäre, heute abend zum Perl-Mongers-Treffen zu kommen. :-)
Dann hätten wir zwar ein überdickes Programm, aber für ein paar Garbage-Collection-Experimente ist immer Zeit.
GreetinX Steffen