2012-12-24 3 views
8

अगर मैं एक हैश है कि मैं पर्ल पर लौटने की उम्मीद कभी नहीं, मैं इसे खाली करने के लिए है के साथ कुछ XS कोड लिखने? यदि हां, तो कैसे?मैं एक एचवी * newHV के साथ बनाया मुक्त करने के लिए है?

निकटतम मैं ले कर आए हैं hv_undef है, लेकिन है कि केवल मैं क्या समझ से, नहीं हैश ही है, हैश की सामग्री को बाहर समाशोधन है।

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

उत्तर

10

newHV (जैसे newSV, newAV, आदि) 1. करने के लिए नव निर्मित मूल्य के संदर्भ गिनती सेट यह मुक्त करने के लिए, you just need to decrement it to 0। वहाँ कि एचवीएस के लिए के लिए कोई विशेष समारोह है, तो सिर्फ SvREFCNT_dec का उपयोग करें:

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

सुपर। मुझे लगता है कि एसवी के उप-वर्ग के रूप में एचवी का हिस्सा मेरे सिर में काम नहीं कर रहा था। यह बहुत अच्छा काम करता है। –

7

newHV रिटर्न एक के लिए एक संदर्भ गणना (refcnt) के साथ एक HV, कि HV पर अपने कोड की पकड़ का सूचक है। आपको लगता है कि HV पूरे कर चुके हैं, तो आप अपने refcnt decrementing द्वारा इस पर अपनी पकड़ जारी करना होगा। ऐसा करने के तीन सामान्य तरीके हैं।

  1. इसके साथ और अब इसके साथ हो गया।

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

    AV और HVSV की "उपवर्गों" कर रहे हैं।

  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)); 
    
संबंधित मुद्दे

 संबंधित मुद्दे