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

Eug*_*tte 8 perl memory-leaks perl-xs

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

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

HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
Run Code Online (Sandbox Code Playgroud)

Ilm*_*nen 10

newHV(比如newSV,newAV等)将新创建的值的引用计数设置为1.要释放它,只需将其减少为0即可.对于HV没有特殊功能,所以只需使用SvREFCNT_dec:

HV* hash = newHV();
/*
 * use the hash
 */
SvREFCNT_dec((SV *) hash);
Run Code Online (Sandbox Code Playgroud)


ike*_*ami 7

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

  1. 在这里和现在完成它.

    SvREFCNT_dec((SV*)hv);
    // hv is no longer safe to use here.
    
    Run Code Online (Sandbox Code Playgroud)

    AV并且HV是"子类" SV.

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

    return sv_2mortal(sv);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 所有权转让".

    rv = newRV_noinc((SV*)hv);
    
    Run Code Online (Sandbox Code Playgroud)

    这是短暂的

    rv = newRV((SV*)hv);
    SvREFCNT_dec((SV*)hv);
    
    Run Code Online (Sandbox Code Playgroud)

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

    return sv_2mortal(newRV_noinc((SV*)hv));
    
    Run Code Online (Sandbox Code Playgroud)