Thread OO-Button-Modul: für SDL (ab geht um OO) (37 answers)
Opened by master at 2006-03-31 19:08

ptk
 2006-04-07 23:21
#64282 #64282
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Die Rückreferenz habe ich übersehen. Mit der schwachen Referenz meine ich das so:
Code: (dl )
1
2
3
4
5
6
7
use Scalar::Util qw(weaken);
...
sub GFXButton::new {
my($class, $container, ...) = @_;
weaken $container;
... Rest des Codes ...
}

Und hier noch etwas Code zum Spielen mit weaken(). In der Ausgabe von Dump() kann man den Referenz-Zählen sehen. Bei der Verwendung von weaken geht der Zähler wieder um eins runter. Und DESTROY zeigt an, an welcher Stelle das Objekt freigegeben wird. Kommentiert man den weaken()-Aufruf aus, ändert sich diese Ausgabe zu "during global destruction" --- ein Zeichen für einen möglichen Memory Leak durch Verwendung von zirkulären Referenzen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
use Scalar::Util qw(weaken);
use Devel::Peek;

sub Container::DESTROY {
warn "Container $_[0] is destroyed!";
}

{
my $container = bless {}, "Container";
Dump $container;
my $button = bless { container => $container }, "Button";
push @{$container->{buttons}}, $button;
Dump $container;
weaken $button->{container};
Dump $container;
}

__END__

View full thread OO-Button-Modul: für SDL (ab geht um OO)