Schrift
[thread]5334[/thread]

weak references als Tk-Attribute: Tk gibt Attributwerte nicht frei?



<< >> 4 Einträge, 1 Seite
Sucher
 2007-06-13 01:37
#46461 #46461
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Hallo,
im folgenden Beispiel bekomme ich den Output
Quote
undefining copy:
undefined copy
configuring:
configured
destroying w:
destroyed w:
destroying Test=SCALAR(0x2c0d670)

Erwartet hätte ich:
Quote
undefining copy:
undefined copy
configuring:
destroying Test=SCALAR(0x2c0d670)
configured
destroying w:
destroyed w:

und dass selbst dach dem 'destroy' auf das Widget noch irgendwo eine Kopie der $ref versunken ist, finde ich sehr seltsam.
Selbst ein $mw->destroy befreit die $ref nicht...

AS-Perl 804.027

Grüße,

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use Tk;
use strict;
use warnings;
use Scalar::Util qw/weaken isweak/;
use Devel::Peek qw/Dump/;;
package Test;
sub DESTROY {
print "destroying ",shift,"\n";
}

package Tk::MyWidget;
require Tk::Frame;
our @ISA = ('Tk::Frame');
Tk::Widget->Construct('MyWidget');
sub Populate{
my ($self,$args) = @_;
$self->SUPER::Populate($args);
$self->ConfigSpecs(-attr => ['PASSIVE',undef,undef,undef]);
}

package main;
my $ref;
{
my $val = 0;
$ref = \$val;
}
bless $ref ,'Test';

my $copy = $ref;
weaken $ref;
#Dump $ref;
my $mw = tkinit;
my $w = $mw->MyWidget(-attr => $ref,
)->pack;
$mw->update;

#Dump $ref;
print "undefining copy:\n";
undef $copy;
print "undefined copy\n";

print "configuring:\n";
$w->configure(-attr => 1);
$mw->update;
print "configured\n";

print "destroying w:\n";
$w->destroy;
$mw->update;
print "destroyed w:\n";
ptk
 2007-06-13 01:54
#46462 #46462
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Auch nach einem $w->destroy existiert das *Perl*-Object weiterhin. Das kannst du leicht überprüfen, indem du ein Dump() danach ausprobierst.

Aber Perl/Tk Memory-Leak-frei zu bekommen, ist eine schwierige Geschichte...
Sucher
 2007-06-13 10:49
#46463 #46463
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Hallo,

selbst wenn ich ein
Code: (dl )
1
2
3
print "undefining w\n";
undef $w;
print "undefined w\n";

an den Code anfüge, wird $ref nicht destroyed. D.H. irgendwo in der Tk library existiert noch eine starke Referenz auf das Objekt. (Mit Objekt meine ich hier $ref).

Grüße,\n\n

<!--EDIT|Sucher|1181717449-->
Sucher
 2007-06-13 13:33
#46464 #46464
User since
2007-03-26
47 Artikel
BenutzerIn
[default_avatar]
Und hier:

--Tadaaa--

Der Output auf meinem Ubuntu mit Slavens neuer Version:

Quote
perl -MTk -e'print "$Tk::VERSION\n"'
804.0275

perl test3.pl
undefining copy:
undefined copy
configuring:
destroying Test=SCALAR(0x839866c)
configured
destroying w:
destroyed w:
<< >> 4 Einträge, 1 Seite



View all threads created 2007-06-13 01:37.