Skip to content

Instantly share code, notes, and snippets.

@klopp
Last active February 6, 2020 12:44
Show Gist options
  • Save klopp/08eec1576a25ab9d4add0e34beafb17e to your computer and use it in GitHub Desktop.
Save klopp/08eec1576a25ab9d4add0e34beafb17e to your computer and use it in GitHub Desktop.
#
# Что произойдет с памятью в этом примере и почему? Как исправить положение?
#
while (1) {
my $a = {};
$a->{func} = sub {
$a->{cnt}++;
};
}
# Здесь счётчик ссылок на $a сохраняется в контексте func, поэтому
# память не будет очищаться. Выход:
#
# use Scalar::Util 'weaken';
# my $a = {};
# weaken $a;
#
# В данном примере, память естесствено утекает из-за перекрестных ссылок.
# Как правильно инициализировать перекрестные ссылки, чтобы память из-за
# них не утекала?
#
while (1) {
my $a = { b => {} };
$a->{b}{a} = $a;
}
# А тут может проще undef $a->{b}{a} в конце цикла.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment