【发布时间】:2011-03-22 18:59:45
【问题描述】:
我在工作中一直在做一个 perl 项目,并且遇到了一个奇怪的内存泄漏。我将问题的根源归结为一个人为的例子:
#!/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($_);
#}
一次取消注释 4 个代码块中的 1 个(在子例程下方),并在监视其内存使用情况的同时运行脚本。在我的机器上,使用 grep 或 map 的代码似乎会导致内存泄漏,而“循环等效”则不会。我的 perl 版本是 v5.10.1,我正在运行 Ubuntu。
我相信这可能是 perl 中的一个错误,但我不想在没有关于可能原因的其他意见的情况下草率地得出结论。谁能解释这种行为是否正确?
谢谢
【问题讨论】:
标签: perl memory-leaks map grep