我应该在不会被返回到堆栈上的Perl的SV上调用SvREFCNT_dec()吗?

时间:2017-02-25 12:37:58

标签: perl perlapi

从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 *)。一般   这个电话没有必要

1 个答案:

答案 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,因为它不必在运行时计算长度。)