在下面的代码段中,类Foo
的对象包含对类Bar
的对象的引用。我希望Foo
对象在Bar
对象之前被销毁。不幸的是,这并不总是发生。奇怪的是,我在不同的系统上得到了不同的行为:在我的笔记本电脑和台式机上,代码总能正常运行,而在我尝试的2个VPS上,析构函数以相反的顺序运行(大多数时候)。所有四个系统都运行相同版本的perl(在x86_64 linux上为5.20.2)。
此外,仅当子(在下面称为abcd
)包含对Foo
对象的引用时才会发生这种情况。如果我删除它,问题就会消失。
#!/usr/bin/perl
use strict;
use warnings;
my $foo = Foo->new;
sub abcd {
$foo;
}
####################
package Foo;
sub new {
bless {bar => Bar->new}, 'Foo';
}
sub DESTROY {
my ($self) = @_;
defined $self->{bar} or print "bar is undefined, this should not happen\n";
}
####################
package Bar;
sub new {
bless {}, 'Bar';
}