释放内存以进行多级哈希

时间:2010-07-27 03:06:10

标签: perl

假设我有多级哈希:

  

$类 - > { 'KEY1'} - > { 'KEY2'} - > {$ KEY3} - GT; { '字串'} - > {$ KEY5},
  其中$ class-> {'key1'} - > {'key2'} - > {$ key3} - > {'string'} - > {$ key5}
  等于某个整数。
  $ key3可以是类名,如“music”,“english”......
  $ key5可以是学生名字,如“mary”,“luke”......

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

  

$ current_class = $ class-> {'key1'} - > {'key2'} - > {“music”};
  $ current_class = undef;

更新

谢谢两位。我在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;

有什么不同?

3 个答案:

答案 0 :(得分:3)

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

的内容
$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;

答案 1 :(得分:3)

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

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

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

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

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

在这两种情况下,Perl的引用计数也可能使用某个值来发现其他内容,在这种情况下,在没有引用之前,该值不会被释放。但是,如果唯一引用是多级哈希中的引用,则应释放内存以供重用。

答案 2 :(得分:0)

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