I
Ivan Fomichev
Hi, folks,
I've encountered a garbage collection problem. It seems, that perl
destroys an object in spite of an existing reference. I'm using perl
v5.8.4. Here is a piece of code:
use strict;
package Singleton;
use Data:
umper;
my $self;
sub new {
print +(caller(0))[3], "\n";
my ($class) = shift;
return $self if $self;
my $item = Item->new();
$self = bless \$item => $class;
print Dumper($self);
return $self;
}
sub DESTROY {
print +(caller(0))[3], "\n";
print Dumper(shift);
}
package Item;
sub new {
print +(caller(0))[3], "\n";
return bless \(my $self = "value") => shift;
}
sub DESTROY {
print +(caller(0))[3], "\n";
}
package main;
my $s = Singleton->new();
__END__
Output is:
Singleton::new
Item::new
$VAR1 = bless( do{\(my $o = bless( do{\(my $o = 'value')}, 'Item' ))},
'Singleton' );
Item:
ESTROY
Singleton:
ESTROY
$VAR1 = bless( do{\(my $o = undef)}, 'Singleton' );
Where is the problem? There is no circular references of whatever, so
why does perl do, what it does? Is it a bug? Is there any workaround?
Do you have any ideas?
If it were not a singleton, everything worked fine, but a singleton is
the very thing I need.
use strict;
package Object;
use Data:
umper;
sub new {
print +(caller(0))[3], "\n";
my ($class) = shift;
my $item = Item->new();
my $self = bless \$item => $class;
print Dumper($self);
return $self;
}
sub DESTROY {
print +(caller(0))[3], "\n";
print Dumper(shift);
}
package Item;
sub new {
print +(caller(0))[3], "\n";
return bless \(my $self = "value") => shift;
}
sub DESTROY {
print +(caller(0))[3], "\n";
}
package main;
my $o = Object->new();
__END__
And here is a reasonable output:
Object::new
Item::new
$VAR1 = bless( do{\(my $o = bless( do{\(my $o = 'value')}, 'Item' ))},
'Object' );
Object:
ESTROY
$VAR1 = bless( do{\(my $o = bless( do{\(my $o = 'value')}, 'Item' ))},
'Object' );
Item:
ESTROY
I've encountered a garbage collection problem. It seems, that perl
destroys an object in spite of an existing reference. I'm using perl
v5.8.4. Here is a piece of code:
use strict;
package Singleton;
use Data:
my $self;
sub new {
print +(caller(0))[3], "\n";
my ($class) = shift;
return $self if $self;
my $item = Item->new();
$self = bless \$item => $class;
print Dumper($self);
return $self;
}
sub DESTROY {
print +(caller(0))[3], "\n";
print Dumper(shift);
}
package Item;
sub new {
print +(caller(0))[3], "\n";
return bless \(my $self = "value") => shift;
}
sub DESTROY {
print +(caller(0))[3], "\n";
}
package main;
my $s = Singleton->new();
__END__
Output is:
Singleton::new
Item::new
$VAR1 = bless( do{\(my $o = bless( do{\(my $o = 'value')}, 'Item' ))},
'Singleton' );
Item:
Singleton:
$VAR1 = bless( do{\(my $o = undef)}, 'Singleton' );
Where is the problem? There is no circular references of whatever, so
why does perl do, what it does? Is it a bug? Is there any workaround?
Do you have any ideas?
If it were not a singleton, everything worked fine, but a singleton is
the very thing I need.
use strict;
package Object;
use Data:
sub new {
print +(caller(0))[3], "\n";
my ($class) = shift;
my $item = Item->new();
my $self = bless \$item => $class;
print Dumper($self);
return $self;
}
sub DESTROY {
print +(caller(0))[3], "\n";
print Dumper(shift);
}
package Item;
sub new {
print +(caller(0))[3], "\n";
return bless \(my $self = "value") => shift;
}
sub DESTROY {
print +(caller(0))[3], "\n";
}
package main;
my $o = Object->new();
__END__
And here is a reasonable output:
Object::new
Item::new
$VAR1 = bless( do{\(my $o = bless( do{\(my $o = 'value')}, 'Item' ))},
'Object' );
Object:
$VAR1 = bless( do{\(my $o = bless( do{\(my $o = 'value')}, 'Item' ))},
'Object' );
Item: