8

如果我编写了一些 XS 代码,其中包含我从未期望返回到 perl 的哈希值,我是否必须释放它?如果是这样,怎么做?

我想出的最接近的是 hv_undef,但据我所知,这只是清除散列的内容,而不是散列本身。

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

2 回答 2

10

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

HV* hash = newHV();
/*
 * use the hash
 */
SvREFCNT_dec((SV *) hash);
于 2012-12-24T21:46:55.247 回答
7

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

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

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

    AV并且HV是 的“子类” SV

  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));
    
于 2012-12-25T04:50:03.387 回答