我最近一直在对一个特别粗糙的递归 XS 进行一些泄漏检查,当我设法让我的所有引用计数工作得很好时,我感到非常高兴。
想象一下,当我在一个相对良性的 Pure Perl 中发现泄漏时,我的震惊!
谁能告诉我为什么这个看似无害的递归函数会像疯子一样泄漏?(Linux、Ubuntu 12.10、64 位)。
#!/usr/bin/perl
use strict;
use warnings;
use Devel::Leak;
sub annotated_hex {
my $annotated = shift;
if (ref $annotated ne 'HASH') { return '<' . (ref $annotated) . '>'; }
my $hex = '';
if (defined $annotated->{hex}) {
$hex .= $annotated->{hex};
}
if (defined $annotated->{elements}) {
if (ref $annotated->{elements} eq 'ARRAY') {
foreach my $element (@{ $annotated->{elements} }) {
$hex .= &annotated_hex ($element);
}
} else {
$hex .= '<Elements=' . (ref $annotated->{elements}) . '>';
}
}
return $hex;
}
Devel::Leak::NoteSV (my $handle);
my $annotated = { 'hex' => 'a824', 'elements' => [ { 'hex' => '0201', }, ] };
my $annotated_hex = &annotated_hex ($annotated);
undef $annotated_hex;
undef $annotated;
Devel::Leak::CheckSV ($handle);
1;
输出有很多泄漏...
$ perl annotate.pl
new 0x22d8a80 : SV = NULL(0x0) at 0x22d8a80
REFCNT = 1
FLAGS = (PADMY)
new 0x22d8f78 : SV = NULL(0x0) at 0x22d8f78
...[24 leaked entries in total]
那是怎么回事?!