【问题标题】:release memory for multi-level hash为多级哈希释放内存
【发布时间】:2011-03-21 09:46:24
【问题描述】:

假设我有一个多级哈希:

$class->{'key1'}->{'key2'}->{$key3}->{'string'}->{$key5},
$class->{'key1'}->{'key2'}->{$key3}->{'string'}->{$key5}
等于某个整数。
$key3 可以是类名,如“音乐”、“英语”...
$key5 可以是学生姓名,例如“mary”、“luke”...

下面的操作会释放$key3="music"级别下的所有内存吗? 即分配给$key5的内存会被释放吗?

$current_class= $class->{'key1'}->{'key2'}->{"音乐"};
$current_class= 未定义;

更新:

感谢两位。我对deleteundef的理解是:delete会去掉key='music'的条目

所以$class->{'key1'}->{'key2'}->{"music"} 将不存在。而undef 会将$class->{'key1'}->{'key2'}->{"music"} 的值设置为undef。但是key='music' 的条目仍然存在,但它的值将是undef 所以$class->{'key1'}->{'key2'}->{"music"} = undef

所以我应该删除条目,对吗?

你是说

undef $class->{'key1'}->{'key2'}->{"music"};

$class->{'key1'}->{'key2'}->{"music"} = undef;

有什么不同?

【问题讨论】:

    标签: perl


    【解决方案1】:

    没有。通常,标量分配是按值复制的。要释放对该对象内存的引用,您必须说类似

    $class->{'key1'}->{'key2'}->{"music"} = undef;       # 2nd,3rd --> are optional
    delete $class->{'key1'}{'key2'}{"music"};
    

    undef 分配给适当的引用也可以。

    $current_class_ref = \$class->{'key1'}{'key2'}{"music"};
    $$current_class_ref = undef;
    

    【讨论】:

      【解决方案2】:

      没有;显示的undef 操作不会释放所有内存。

      这很容易。更难的是“我如何释放内存?”,我认为一个答案是:

      undef $class->{'key1'}->{'key2'}->{"music"};
      

      另一个(这是 Perl!)可能是:

      delete $class->{'key1'}->{'key2'}->{"music"};
      

      在这两种情况下,Perl 的引用计数可能会发现其他东西也使用了某个值,在这种情况下,直到没有引用剩余时才会释放该值。但是,如果唯一的引用是多级哈希中的引用,则应该释放内存以供重用。

      【讨论】:

        【解决方案3】:

        Perl 有reference counting garbage collector

        $ cat test.pl

        #!/usr/bin/perl
        use strict;
        package Cat;
        sub new { my ($class,$name) = @_; print "cat $name here\n"; bless \$name, $class; }
        sub DESTROY { my $self = shift; print "  cat $$self gone\n"; }
        
        package main;
        my $ref->{aaa}->{bbb}->{ccc} = new Cat 'Alfred';
        print  "111111\n";
        $ref->{aaa} = 'qweqwe';
        print  "222222\n";
        

        $ ./test.pl

        cat Alfred here
        111111
          cat Alfred gone
        222222
        

        【讨论】:

        • 有趣的例子。当 $ref->{aaa} 指向某事。否则, new() 将被销毁
        猜你喜欢
        • 2017-05-20
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        相关资源
        最近更新 更多