освободить память для многоуровневого хэша - PullRequest
2 голосов
/ 27 июля 2010

Предположим, у меня есть хеш уровня muti:

$ класс -> { 'key1'} -> { 'key2'} -> {$ ключ3} -> { 'строка'} -> {$ key5},
где $ class -> {'key1'} -> {'key2'} -> {$ key3} -> {'string'} -> {$ key5}
равно некоторому целому числу.
$ key3 может быть именем класса, таким как "музыка", "английский" ...
$ 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;

разные?

Ответы [ 3 ]

3 голосов
/ 27 июля 2010

Нет;показанная операция undef не освободит всю память.

Это было легко.Что сложнее: «Как освободить память?», И я думаю, что один ответ:

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

Другой (это Perl!) Может быть:

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

В некоторых случаях подсчет ссылок в Perl может обнаружить что-то еще, также используя некоторое значение, и в этом случае это значение не будет выпущено, пока не останется никаких ссылок.Однако, если в многоуровневом хеше есть только ссылки, память должна быть освобождена для повторного использования.

3 голосов
/ 27 июля 2010

Нет. В общем случае скалярные назначения копируются по значению. Чтобы освободить ссылку на память этого объекта, вы должны сказать что-то вроде

$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;
0 голосов
/ 04 августа 2010

Perl имеет сборщик мусора подсчета ссылок .

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...