This leaks practically nothing
#!/usr/bin/perl --
use strict;
use warnings;
use WWW::Mechanize;
use HTML::TableExtract qw(tree);
start();
exit();
sub start {
my $agent = WWW::Mechanize->new( stack_depth => 0 );
$agent->agent_alias('Windows IE 6');
$agent->get('http://www.perlmonks.org/');
my $page = $agent->content;
for ( my $c = 0 ; $c < 500 ; $c++ ) {
my $te = HTML::TableExtract->new();
$te->parse($page);
$te->eof;
print "$te c is $c\n";
eval { $te->delete; }; ## leaks memory without this call as exp
+ected
undef $te;
select undef, undef, undef, 0.1;
} ## end for ( my $c = 0 ; $c < ...)
} ## end sub start
BEGIN {
sub HTML::TableExtract::DESTROY {
my ($self) = @_;
for my $key ( keys %$self ) {
eval { $self->{$key}->delete; };
eval { $self->{$key}->detach; };
delete $self->{$key};
}
return;
} ## end sub HTML::TableExtract::DESTROY
*HTML::ElementTable::DESTROY = \&HTML::TableExtract::DESTROY;
*HTML::ElementGlob::DESTROY = \&HTML::TableExtract::DESTROY;
*HTML::TableExtract::Table::DESTROY = \&HTML::TableExtract::DESTROY;
} ## end BEGIN
on my machine it starts at 17mb/14mb VM, and by the 500th iteration its at 18mb/16mb.
My guess is this very tiny leak is probably in HTML::Parser.