从perl调用C函数时,例如使用Inline::C
:
use feature qw(say);
use strict;
use warnings;
use Inline C => './test.c';
say "Calling test()..";
test();
say "Finished.";
其中 test.c
是:
void test()
{
SV *sv_variable = newSVpv("test", 0);
// do something..
//SvREFCNT_dec(sv_variable); // free variable
printf( "Returning from test()..n");
return;
}
无论我是否致电SvREFCNT_dec(sv_variable)
,脚本似乎都很好。根据perlguts
:
要释放您创建的SV,请调用SVREFCNT_DEC(SV*)。通常情况下 这个电话不是必需的
是的,您应该减少重新数。(如果不这样做,则没有直接的不良效果,但是您已经创建了一个内存泄漏。)
perlguts可能说这通常不是必需的,因为大多数SV不仅在C函数内部使用;它们是可从Perl空间到达或放在堆上的结构的一部分。
但请注意,您的代码结构并不例外:如果// do something
中的任何功能抛出,则sv_variable
将泄漏(因为SvREFCNT_dec
永远不会达到)。这可以通过:
SV *sv_variable = sv_2mortal(newSVpv("test", 0));
sv_2mortal
就像延期的 SvREFCNT_dec
:它将减少参考数计数的时间"以后"。
(如果您是从字符串文字创建SV,则newSVpvs("test")
比newSVpv
更好,因为它不必在运行时计算长度。)