0

Я пытаюсь написать демона с perl. Теперь этот демон имеет следующий код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; 
} 

Мой вопрос от выше, делает ссылку на% идти прочь и делает это очищаются, когда б выходит из области видимости?

+0

OT: Это должно быть 'my% a =();' который является просто силильным способом записи 'my% a;'. Всегда используйте 'use strict; используйте предупреждения; ' – ikegami

+0

Там вы идете. Но имеет ли это смысл то, что я говорю? Меня беспокоит, что я могу утешить память здесь. –

ответ

3

b возвращает значение $newdata, которая является ссылкой на ANON хэш, который содержит ссылку на %a, который содержит скаляр в элементе с ключом boo.

Если значение, возвращаемое b не сохраняется, то ничего не будет ссылки на значение $newdata, поэтому он будет получать освобождены, так что ничего не будет ссылки на Анон хэш, поэтому он будет получать освобождены, так что ничего не будет ссылаться на скаляр в элемент с ключом boo, поэтому он будет освобожден.

Нет циклов. Нет утечки.