2012-12-24 65 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)); 
    
相關問題