Perl R2泄漏内存

Perl R2泄漏内存,perl,parsing,memory-leaks,marpa,Perl,Parsing,Memory Leaks,Marpa,我正在使用最新版本的marpa::r2(marpa-r2-2.065_002),它似乎很快就耗尽了所有内存。我写了下面的脚本来测试它 use strict; use warnings FATAL => 'all'; use Marpa::R2; use Data::Dumper; my $grammar = Marpa::R2::Scanless::G->new({ action_object => __PACKAGE__, source => \(<<

我正在使用最新版本的marpa::r2(marpa-r2-2.065_002),它似乎很快就耗尽了所有内存。我写了下面的脚本来测试它

use strict;
use warnings FATAL => 'all';
use Marpa::R2;
use Data::Dumper;

my $grammar = Marpa::R2::Scanless::G->new({
 action_object => __PACKAGE__,
 source => \(<<'END_OF_SOURCE'),
 :default ::= action => ::array
 :start ::= path
 path ::=
  step               action => _do_step
 step ~ [a-z]+ 
END_OF_SOURCE
});

sub _do_step{ return {step => $_[1]}};


sub new {}     #The Marpa::R2 needs it
sub compile{
 my ($query) = @_; 
 return undef unless $query;

 my $reader = Marpa::R2::Scanless::R->new({
  grammar => $grammar,
  trace_terminals => 0,
 });
 $reader->read(\$query);
 print Dumper $reader->value;
}

compile($_) foreach ('aaaa'..'zzzz'); 
使用严格;
使用警告致命=>“全部”;
使用Marpa::R2;
使用数据::转储程序;
my$grammar=Marpa::R2::Scanless::G->new({
操作\u对象=>\uuu包\uuuu,
source=>\(\u do\u步骤
步骤~[a-z]+
_源的结束_
});
子步骤{return{step=>$\[1]};
次新的{}#Marpa::R2需要它
子编译{
我的($query)=@;
返回undef,除非$query;
my$reader=Marpa::R2::无扫描::R->新建({
语法=>$grammar,
跟踪_终端=>0,
});
$reader->read(\$query);
打印转储程序$reader->value;
}
编译($)foreach('aaaa'..'zzzz');
如何防止内存泄漏

编辑:这现在作为错误报告给


编辑:现在已在发布版Marpa-R2 2.066000上修复。感谢

已在CPAN上的Marpa-R2 2.065_006中修复泄漏。感谢您指出这一点,并感谢amon提供的最小示例,这节省了我的时间,使事情变得更简单

问题出在Perl代码中。两个结构相互引用——一个循环引用。使用amon的示例测试固定版本会产生随时间推移绝对平稳的内存使用


我将尽快在CPAN上发布一个索引(非开发人员的)版本。

在perl5 v16.3上用我的Marpa v2.064确认。要复制的最小代码:
perl-MMarpa::R2-e'*M:=*Marpa::R2::Scanless::;my$g=M::g->new({source=>\q(:start:=A:=[]));M::R->new({grammar=>g})对于1..1E5'
。您已经提交了错误吗?提交了错误吗?很抱歉,我对这些东西不熟悉。我应该在哪里做?感谢您的确认和最小代码OK,错误报告给bug-Marpa-R2[在]rt.cpan.orgamon是对的。我收到了错误报告。我将内存泄漏视为严重问题,并将优先考虑。是的,我已经用我的代码尝试过了,效果非常好。谢谢!此修复程序现在包含在完整的索引cpan发行版中:Marpa-R2 2.066000