Perl XS代码中的内存泄漏在哪里? 我有一个C++程序,使用Perl使用Perl::CPP执行。代码似乎占用了大量内存,因此我假设存在某种泄漏。我已经编写了下面的代码,它再现了相同的问题,但要简单得多。我在循环代码1000000次以测试代码性能时发现了漏洞。这个简单的Perl脚本使用828MiB,我的完整程序使用1.3GiB

Perl XS代码中的内存泄漏在哪里? 我有一个C++程序,使用Perl使用Perl::CPP执行。代码似乎占用了大量内存,因此我假设存在某种泄漏。我已经编写了下面的代码,它再现了相同的问题,但要简单得多。我在循环代码1000000次以测试代码性能时发现了漏洞。这个简单的Perl脚本使用828MiB,我的完整程序使用1.3GiB,c++,perl,xs,inline-c,C++,Perl,Xs,Inline C,我试过很多方法,比如对代码中的各种变量使用SvREFCNT\u dec,newRV\u noinc,sv\u free,以及sv\u 2mortal,但我一直无法降低内存使用率 下面是我的示例代码: 使用数据::转储程序; 打印转储程序测试(); 使用内联'CPP'=>您需要释放for循环中未返回到Perl脚本的哈希。此循环: for (int i = 0; i < 1000000; i++) { hash = test_leak (); } for(int i=0;i

我试过很多方法,比如对代码中的各种变量使用
SvREFCNT\u dec
newRV\u noinc
sv\u free
,以及
sv\u 2mortal
,但我一直无法降低内存使用率

下面是我的示例代码:

使用数据::转储程序;
打印转储程序测试();

使用内联'CPP'=>您需要释放
for
循环中未返回到Perl脚本的哈希。此循环:

for (int i = 0; i < 1000000; i++) {
    hash = test_leak ();
}
for(int i=0;i<1000000;i++){
hash=test_leak();
}
应该是这样的:

for (int i = 0; i < 1000000; i++) {
    hash = test_leak ();
    SvREFCNT_dec(hash);  // Free the memory not returned to Perl
 }
 hash = test_leak();  // The final hashref is returned to Perl
for(int i=0;i<1000000;i++){
hash=test_leak();
SvREFCNT_dec(hash);//释放未返回到Perl的内存
}
hash=test_leak();//最后的hashref返回给Perl

我不擅长使用xs,但在我编写的类似代码中,我有
sv2mortal((sv*)flist)
AV*flist=newAV()之后(然后填充数组
flist
)。这是针对C,而不是C++。@ ZIMDead放置<代码> Sv2D凡因((Sv*)数组);
after
AV*array=newAV()没有改变内存使用,它只造成了错误,比如“尝试在C++ TestCurr.PL 54行中尝试免费引用标量:SV 0x55 78D5A6C68,Perl解释程序:0x55 7588D6B2A0。”XS代码是C,并且可以在C++中编写标准C,所以我认为如果使用C++,它并不重要。我还尝试删除所有C++特性,使用内联::C,但问题仍然存在。我希望这能有所帮助,因为我看不出显示的代码中有什么可以释放内存。(但现在我也看到我误读了
array\u to\u av()
的用途)。