我是否应该在不会返回堆栈上的Perl的SV上调用SVREFCNT_DEC()



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

相关内容

  • 没有找到相关文章

最新更新