我是否必须释放使用newHV创建的HV *?

时间:2012-12-24 19:46:40

标签: perl memory-leaks perl-xs

如果我用一个我从不期望返回perl的哈希编写一些XS代码,我是否必须释放它?如果是这样,怎么样?

我最接近的是hv_undef,但这只是清除哈希的内容,而不是我理解的哈希本身。

HV* hash = newHV();
...
use the hash
...
hv_undef(hash);

2 个答案:

答案 0 :(得分:10)

newHV(例如newSVnewAV等)将新创建的值的引用计数设置为1.要释放它,you just need to decrement it to 0。对于HV没有特殊功能,所以只需使用SvREFCNT_dec

HV* hash = newHV();
/*
 * use the hash
 */
SvREFCNT_dec((SV *) hash);

答案 1 :(得分:7)

newHV返回HV,引用计数(refcnt)为1,表示您的代码保留HV。当你完成那个HV时,你必须通过减少它的refcnt来释放它。有三种常见的方法可以做到这一点。

  1. 现在就完成它。

    SvREFCNT_dec((SV*)hv);
    // hv is no longer safe to use here.
    

    AVHVSV的“子类”。

  2. 在调用者有机会引用它之后完成它。 (不适用于哈希。)

    return sv_2mortal(sv);
    
  3. 转移“所有权”。

    rv = newRV_noinc((SV*)hv);
    

    这是

    的缩写
    rv = newRV((SV*)hv);
    SvREFCNT_dec((SV*)hv);
    

    请注意,完成此操作后,您必须同时释放rv,因此您经常会看到以下内容:

    return sv_2mortal(newRV_noinc((SV*)hv));