perl循环引用。这是发生了什么

时间:2013-08-28 01:40:15

标签: perl memory-management memory-leaks circular-reference perl-data-structures

我正在尝试用perl编写一个守护进程。现在这个守护进程有以下代码

sub b {
    my $data;
    if (some condition) {
         $data->{"endsmeet"} = 1;
    } else {
        $data->{"endsmeet"} = 2;
    }

    my $newData = a($data);
}

sub a {
    my ($data) = @_;
    my %a = ();
    my $newData = {
      endsmeet => undef,
    };
    $a{"boo"} = $data->{"endsmeet"};
    $newData->{"endsmeet"} = \%a;
    return $newData;
}

我的问题来自上述问题,%a的参考是否会消失,当b超出范围时是否会清理它?

1 个答案:

答案 0 :(得分:4)

b返回$newdata的值,它是对anon哈希的引用,它包含对%a的引用,boo在元素中保存带有键{{1}的标量}}

如果b返回的值未存储,则没有任何内容会引用$newdata的值,因此它将被释放,因此没有任何内容会引用anon哈希值,因此它将被释放,所以没有任何东西会引用带有键boo的元素中的标量,因此它将被释放。

没有周期。没有泄漏。