2012-12-24 12 views
8

Jeśli napiszę kod XS z hashem, którego nigdy nie oczekuję, aby powrócić do Perla, czy muszę go zwolnić? Jeśli tak to jak?Czy muszę zwolnić HV * stworzoną z newHV?

Najbliżej mam wymyślić jest hv_undef, ale to jest tylko wyczyszczenie zawartości mieszania, a nie sam hash, z tego co rozumiem.

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

Odpowiedz

10

newHV (jak newSV, newAV, itd.) Ustawia licznik odniesienia nowo utworzonej wartości 1. Aby uwolnić go you just need to decrement it to 0. Nie ma za to specjalna funkcja dla HV, więc wystarczy użyć SvREFCNT_dec:

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

Super. Myślę, że część HV jako podklasy SV nie działa w mojej głowie. Działa to świetnie. –

7

newHV zwraca HV z liczbą odniesienia (RefCnt) jednego, oznaczający trzymać swój kod w sprawie tej HV. Kiedy skończysz z tym HV, musisz zwolnić blokadę, zmniejszając jej wartość refcnt. Istnieją trzy typowe sposoby robienia tego.

  1. Zrobione z nim tu i teraz.

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

    AV i HV są "podklasy" z SV.

  2. z nim zrobić po dzwoniącego ma szansę go odwołać. (Tak naprawdę nie ma zastosowania do skrótów).

    return sv_2mortal(sv); 
    
  3. Przenieś "własność".

    rv = newRV_noinc((SV*)hv); 
    

    To skrót

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

    Pamiętaj, że musisz podobnie uwalniać swoją pozycję na rv kiedy skończysz z nim, więc często można zobaczyć następujące:

    return sv_2mortal(newRV_noinc((SV*)hv)); 
    
Powiązane problemy