为什么首先销毁包含的对象?

时间:2016-08-14 01:17:34

标签: perl

在下面的代码段中,类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';
}

0 个答案:

没有答案