假设我有多级哈希:
$类 - > { '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;
谢谢两位。我在delete
和undef
之间的理解是: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;
有什么不同?
答案 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