[英]Where is the memory leak in my Perl XS code?
我有一個用 C++ 編寫的大型程序,並使用 Inline::CPP 從 Perl 執行。 代碼似乎使用了大量內存,所以我假設存在某種泄漏。 我編寫了以下代碼來重現相同的問題,但要簡單得多。 當我循環代碼 1,000,000 次以測試代碼的性能時,我發現了泄漏。 這個簡單的 Perl 腳本使用 828MiB,而我的完整程序使用 1.3GiB。
我已經嘗試了很多東西,比如在代碼中的各種變量上使用SvREFCNT_dec
、 newRV_noinc
、 sv_free
和sv_2mortal
,但我一直無法降低內存使用量。
這是我的示例代碼:
use Data::Dumper;
print Dumper test ();
use Inline 'CPP' => << 'CPP';
#include <array>
using namespace std;
AV *array_to_av (const array<int,3> &v)
{
AV *array = newAV ();
for (int i : v) {
av_push (array, newSViv (i));
}
return array;
}
SV *test_leak ()
{
HV *hash = newHV ();
AV *array1 = array_to_av ({1,2,3});
AV *array2 = array_to_av ({1,2,3});
AV *array3 = array_to_av ({1,2,3});
SV *value1 = newRV_noinc ((SV *)(array1));
SV *value2 = newRV_noinc ((SV *)(array2));
SV *value3 = newRV_noinc ((SV *)(array3));
hv_stores (hash, "Test1", value1);
hv_stores (hash, "Test2", value2);
hv_stores (hash, "Test3", value3);
return newRV_noinc ((SV *)(hash));
}
SV *test ()
{
SV *hash;
for (int i = 0; i < 1000000; i++) {
hash = test_leak ();
}
return hash;
}
CPP
sleep 10;
您需要在for
循環中釋放未返回到 Perl 腳本的哈希。 這個循環:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.