2012-12-24 39 views
8

如果我用一个散列写一些XS代码,我从来没有想过会返回到perl,那么我需要释放它吗?如果是这样,怎么样?我需要释放由newHV创建的HV *吗?

我最近想到的是hv_undef,但这只是从我所了解的内容中清除散列的内容,而不是散列本身。

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

回答

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

超级。我想HV的一部分作为SV的一个子类并不适合我。这很好。 –

7

newHV返回一个的引用计数(refcnt)的HV,对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)); 
    
相关问题