Perl map/grep утечка памяти

Я работал над проектом жемчуга на работе и столкнулся со странной утечкой памяти. Я изложил источник кратко своей проблемы в изобретенный пример:

#!/usr/bin/perl
use strict;
use warnings;

# takes: an array reference
# returns: 1
sub g {
    my ($a) = @_;
    return 1; 
}

# takes: nothing
# returns: the result of applying g on an array reference
sub f {
    my @a = ('a') x 131072; # allocate roughly a megabyte 
    return g(\@a); 
}

# causes a leak:
#map { f($_) } (1..100000); 

# loop equivalent to map, no leak:
#my @b;
#for my $i (1..100000) {
#    push @b, f($_);
#}

# causes a leak:
#grep { f($_) } (1..100000);

# loop equivalent to grep, no leak:
#my @b;
#for my $i (1..100000) {
#    push @b, $i if f($_);
#}

Некомментарий 1 этих 4 блоков кода (под подпрограммами) за один раз и запущенный скрипт при контроле его использования памяти. На моей машине код, который использует grep или карту, кажется, вызывает утечки памяти, тогда как "цикл, эквивалентный" s, не делает. Моя версия жемчуга является v5.10.1, и я запускаю Ubuntu.

Я полагаю, что это могло быть ошибкой в жемчуге, но я не хочу переходить к решительному заключению без другого мнения о том, что могло быть причиной. Кто-либо может объяснить, корректно ли это поведение?

Спасибо

6
задан James Gleeson 29 July 2010 в 15:02
поделиться