我必须释放与newHV创建的HV*吗?



如果我编写一些XS代码,其中包含一个我从未期望返回给perl的散列,我是否必须释放它?如果有,怎么做?

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

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

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

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

newHV返回一个引用计数(refcnt)为1的HV,表示您的代码对该HV的持有。当你用完HV后,你必须通过减少它的折射来释放你对它的控制。有三种常见的方法。

  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));
    

相关内容

  • 没有找到相关文章

最新更新