2012-12-24 5 views
8

Se scrivo un codice XS con un hash che non mi aspetto di tornare su perl, devo liberarlo? Se é cosi, come?Devo liberare un HV * creato con newHV?

Il più vicino che ho trovato è hv_undef, ma questo è solo quello di chiarire il contenuto dell'hash, non l'hash stesso, da quello che ho capito.

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

risposta

10

newHV (come newSV, newAV, etc.) imposta il numero di riferimento del valore appena creato 1. Per liberarlo, you just need to decrement it to 0. Non c'è nessuna funzione speciale per quella per HVS, quindi basta usare SvREFCNT_dec:

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

Super. Immagino che la parte di HV come sottoclasse di SV non funzionasse nella mia testa. Funziona alla grande –

7

newHV restituisce un HV con un conteggio di riferimento (RefCnt) di uno, a significare la presa di tuo codice su quel HV. Quando hai finito con quello HV, devi rilasciare il blocco su di esso decrementando il suo refcnt. Ci sono tre modi comuni per farlo.

  1. Fatto con esso qui e ora.

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

    AV e HV sono "sottoclassi" di SV.

  2. Fatto con esso dopo che il chiamante ha la possibilità di fare riferimento. (Realtà non si applica alle hash.)

    return sv_2mortal(sv); 
    
  3. Transfer "proprietà".

    rv = newRV_noinc((SV*)hv); 
    

    Questo è l'abbreviazione di

    rv = newRV((SV*)hv); 
    SvREFCNT_dec((SV*)hv); 
    

    Si noti che è necessario allo stesso modo rilasciare la presa sul rv quando hai finito con esso, così vedrete spesso il seguente:

    return sv_2mortal(newRV_noinc((SV*)hv));