gpt4 book ai didi

c++ - 我的 Perl XS 代码中的内存泄漏在哪里?

转载 作者:行者123 更新时间:2023-12-03 06:56:46 24 4
gpt4 key购买 nike

我有一个用 C++ 编写并使用 Inline::CPP 从 Perl 执行的大型程序。该代码似乎使用了大量内存,因此我假设存在某种泄漏。我编写了以下重现相同问题的代码,但要简单得多。当我将代码循环 1,000,000 次以测试代码的性能时,我发现了泄漏。这个简单的 Perl 脚本使用 828MiB,而我的完整程序使用 1.3GiB。

我已经尝试了很多东西,比如在代码中的各种变量,但我无法降低内存使用量。

这是我的示例代码:

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

关于c++ - 我的 Perl XS 代码中的内存泄漏在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64084883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com