Thread OOP: mit Arrays arbeiten (10 answers)
Opened by Hagen at 2007-09-06 23:50

renee
 2007-09-07 12:29
#99188 #99188
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Garbage Collection in Perl läuft so, dass die Referenzen gezählt werden. Und der Inhalt des Speichers geht nur dann "verloren" wenn der Referenzzähler auf "0" steht, das heißt keine Stelle im Programm mehr auf den Speicher zeigt. Wenn Du ein Programm hast, in dem es heißt

Code (perl): (dl )
1
2
3
4
sub test{
    my @array = (1..10);
    # mach was mit @array
}


dann wird in Zeile 2 das Array angelegt und Speicher freigehalten. Der Referenzzähler ist dann "1". Wenn die Subroutine verlassen wird, wird das Array "zerstört", der Referenzzähler wird auf "0" gesetzt. Der Speicher wird freigegeben und Du kommst nicht mehr an den Inhalt ran.

Wenn Du so etwas machst:
Code (perl): (dl )
1
2
3
4
5
6
my $arref = test();

sub test{
    my @array = (1..10);
    return \@array;
}


dann wird bei der Initialisierung des Arrays wieder der Referenzzähler auf "1" gesetzt. Durch die Erzeugung der Referenz beim "return" wird der Referenzzähler auf "2" gesetzt. Beim Verlassen der Sub existiert zwar "@array" nicht mehr (der Referenzzähler wird auf "1" gesetzt), aber die Referenz, die mittels "\@array" erzeugt wurde, existiert in $arref ja weiter. Da der Referenzzähler != 0 ist, wird der Speicher nicht freigegeben und Du kommst über die Referenz noch an den Inhalt.

Lesenswert zu diesem Thema ist "Intermediate Perl" Kapitel 5
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/

View full thread OOP: mit Arrays arbeiten