从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)
,脚本似乎都能正常运行。根据{{3}}:
要释放您已创建的SV,请调用SvREFCNT_dec(SV *)。一般 这个电话没有必要
答案 0 :(得分:4)
是的,您应该减少引用计数。 (如果你没有,那么没有直接的不良影响,但是你已经造成了内存泄漏。)
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
,因为它不必在运行时计算长度。)