Thursday 15 January 2015

c - How to properly free an erlang term -


उदाहरण के कार्यक्रम में

  tuplep = erl_decode (buf); Fnp = erl_element (1, ट्यूप्लेप); Argp = erl_element (2, ट्यूप्लेप); ... erl_free_compound (tuplep); erl_free_term (FNP); erl_free_term (argp);   

दोनों erl_free_compound और erl_free_term का उपयोग शब्द को मुक्त करने के लिए किया जाता है (और इसके उप-टर्म) अलग से एक ही ETERM *। Erl_free_compund () के दस्तावेज़ीकरण से यह कहते हैं कि

erl_free_compound () एक दी एर्लांग शब्द से जुड़े सभी उप-शर्तों को बार-बार मुक्त कर देगा

इसलिए, मेरा प्रश्न है, erl_element () तत्व की एक प्रति बनाता है, जो अलग से मुक्त नहीं है अगर स्मृति को लीक करेगा या उपरोक्त स्थिति दोहरे मुफ़्त की वजह से हो सकती है जो एआरएल_फ्री_टरम द्वारा पता लगाया जाता है। >

erl_interface लाइब्रेरी वास्तव में आबंटित ETERM structs का ट्रैक रखने के लिए संदर्भ गिनती प्रणाली के एक प्रकार का उपयोग करता है। तो अगर आप लिखते हैं: <प्री> ETERM * t_arr [2]; एटीईआरएम * टी 1; T_arr [0] = erl_mk_atom ("हैलो"); T_arr [1] = erl_mk_atom ("विश्व"); T1 = erl_mk_tuple (& amp; t_arr [0], 2);

आपने तीन (3) एरलांग शब्द (एटीईआरएम) बनाए हैं अब अगर आप कॉल करते हैं: erl_free_term (t1) आप केवल टूप्ल को मुक्त करते हैं अन्य दो ETERM के नहीं। सभी आवंटित स्मृति को खाली करने के लिए, आपको कॉल करना होगा:

  erl_free_term (t_arr [0]); erl_free_term (t_arr [1]); Erl_free_term (t1)   

इन सभी कॉलों को erl_free_term () से बचने के लिए आप इसका उपयोग कर सकते हैं: erl_free_compund () इसके बजाय। यह सभी "एटीएमटीएएम" से मुक्त है। इसलिए उपर्युक्त निम्नलिखित के साथ पूरा किया जा सकता है:

  erl_free_compund (t1)   

इस प्रकार, यह नियमित आपके लिए एक अधिक कॉम्पैक्ट तरीके से लिखना संभव बनाता है आपको सभी उप-घटक एटीईआरएम के संदर्भों को याद नहीं रखना है। उदाहरण:

  ETERM * सूची; सूची = erl_cons (erl_mk_int (36), erl_cons (erl_mk_atom ("tobbe"), erl_mk_empty_list ())); ... / * कुछ काम * / erl_free_compound (सूची);   

अपडेट : यह देखने के लिए कि क्या आप वास्तव में सभी नियम बनाते हैं, आप इस कोड का उपयोग कर सकते हैं (:

  Printf ("वर्तमान में आवंटित ब्लॉक:% ld \ n", आवंटित); printf ("फ़्रीलिस्ट की लंबाई:% ld \ n", मुक्त); / * लंबे समय से आवंटित, मुक्त; erl_eterm_statistics (और आवंटित, और मुक्त) वास्तव में फ्रीलिस्ट * / erl_eterm_release ();   

()

No comments:

Post a Comment