Ich habe an einem Perl-Projekt gearbeitet und bin auf ein merkwürdiges Speicherleck gestoßen. Ich habe die Quelle meines Problems in ein konstruiertes Beispiel kocht:Perl map/grep memory leak
#!/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($_);
#}
Kommentar- 1 der 4 Codeblöcke (unterhalb der Unterprogramme) zu einem Zeitpunkt, und das Skript ausführen, während seine Speichernutzung zu überwachen. Auf meinem Computer scheint der Code, der grep oder map verwendet, Speicherlecks zu verursachen, während die "Schleifenäquivalente" dies nicht tun. Meine Perl-Version ist v5.10.1, und ich benutze Ubuntu.
Ich glaube, das könnte ein Fehler in Perl sein, aber ich möchte nicht zu einer drastischen Schlussfolgerung ohne eine andere Meinung über das, was die Ursache sein könnte, springen. Kann jemand erklären, ob dieses Verhalten korrekt ist?
Dank