J'ai travaillé sur un projet Perl au travail, et j'ai rencontré une étrange fuite de mémoire. Je l'ai fait bouillir sur la source de mon problème dans un exemple artificiel:Perl map/Grep fuite de mémoire
#!/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($_);
#}
Uncomment 1 des 4 blocs de code (sous les sous-routines) à la fois et exécutez le script tout en surveillant son utilisation de la mémoire. Sur ma machine, le code qui utilise grep ou map semble provoquer des fuites de mémoire, alors que les "boucles équivalent" ne le font pas. Ma version perl est v5.10.1, et j'utilise Ubuntu.
Je crois que cela pourrait être un bug dans Perl, mais je ne veux pas sauter à une conclusion radicale sans une autre opinion sur ce qui pourrait être la cause. Quelqu'un peut-il expliquer si ce comportement est correct?
Merci