2010-08-26 17 views
5

निम्नलिखित स्थिति मान लें:लुआ: कचरा संग्रहण + userdata

typedef struct rgb_t {float r,g,b} rbg_t; 

// a function for allocating the rgb struct 
rgb_t* rgb(r,g,b) { 
rgb_t* c = malloc(sizeof(rgb_t)); 
c->r=r; 
c->g=g; 
c->b=b; 
return c; 
} 

// expose rgb creation to lua 
int L_rgb (lua_State* L) { 
rgb_t** ud = (rgb_t **) lua_newuserdata(L, sizeof(rgb_t *)); 
*ud = rgb(lua_tonumber(L,1),lua_tonumber(L,2),lua_tonumber(L,3)); 
return 1; 
} 

L_rgb समारोह लुआ से कहा जाता है जब दो आवंटन होता है। लूआ नए उपयोगकर्ता डेटा और आरजीबी कन्स्ट्रक्टर फ़ंक्शन को आवंटित करने के लिए आवंटित करता है। जब उपयोगकर्ता लूआ में गुंजाइश से बाहर हो जाता है तो उपयोगकर्ता डेटा वैरिएबल का क्या होता है? यदि यह कचरा है तो संरचना के आवंटन के साथ क्या होता है?

उत्तर

12

आपके पास इस स्थिति के दो दृष्टिकोण हैं, और दोनों आपके विशिष्ट मामले पर लागू हो सकते हैं। अन्य मामलों में आप एक दूसरे को चुनने के लिए अधिक दृढ़ता से ड्राइव करते हैं।

  1. रूप में आप अपने नमूना में क्या आप कर सकते हैं, और malloc() का उपयोग अपने निजी डेटा ब्लॉक मिलता है, और एक पूर्ण userdata में इसे करने के लिए एक सूचक स्टोर करने के लिए। यदि आप ऐसा करते हैं, तो आपको उपयोगकर्ता डेटा पर मेटाटेबल सेट करना होगा, और उपयोगकर्ताडाटा को कचरा इकट्ठा करने पर आवंटित ब्लॉक को मुक्त करने के लिए __gc मेटामाउथ का उपयोग करना होगा।

  2. malloc() के स्थान पर lua_newuserdata() पर कॉल करके आप अपने निजी डेटा ब्लॉक के आवंटन के रूप में उपयोगकर्ताडेटा का उपयोग कर सकते हैं। इस मामले में आपको __gc मेटामाइट की आवश्यकता नहीं है क्योंकि लुआ सीधे आवंटन के जीवनकाल का प्रबंधन करेगा। आप अभी भी एक मेटाटेबल प्राप्त करना चाहते हैं ताकि आप r, g, और b नामक सदस्यों की उपस्थिति बनाने के लिए अपनी __index प्रविष्टि का उपयोग कर सकें जो आपकी संरचना से उनके मूल्य पुनर्प्राप्त कर सके।

किसी भी तरह से, आपको त्रुटि प्रबंधन के बारे में सोचना होगा।

+2

विधि # 2 आपको आवंटन ट्रैकिंग से छुटकारा दिलाएगा - लुआ त्रुटियों और स्टैक रिवाइंड पर, लुआ का जीसी अभी भी कोड ब्लॉक को उचित रूप से ट्रैक और रिलीज़ करेगा। – u0b34a0f6ae

+0

क्या कोई बदलाव है जो आप यहां सहायता कर सकते हैं: http://stackoverflow.com/questions/41080633/can-i-load-additional-functions-in-base-open-without-breaking-lua-state? – displayname

2

अपने उपयोगकर्ता डेटा के लिए एक मेटाटेबल जोड़ें, और अपने deallocation फ़ंक्शन पर __gc कुंजी सेट करें। the docs

+0

किसी भी विचार क्या समस्या यहाँ है: http://stackoverflow.com/questions/41080633/can-i-load-additional-functions-in-base-open-without-breaking-lua-state? – displayname

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