2012-04-10 6 views
5

मैं एक PHP विस्तार में सरणी की सरणी बनाना और वापस करना चाहता हूं। जो मैं समझता हूं, उससे मुझे emalloc() का उपयोग करके सरणी तत्वों के लिए स्थान आवंटित करना चाहिए, लेकिन जो मुझे समझ में नहीं आता है वह यह है कि इसे मुक्त करने के लिए उचित है। मैं एक PHP समारोह इस के समान है:एक PHP विस्तार में स्मृति को मुक्त करने के लिए कब?

PHP_FUNCTION(test) 
{ 
    int i; 
    zval **pt = emalloc(sizeof(zval*) * 10); 

    array_init(return_value); 

    for (i = 0; i < 10; ++i) { 
     MAKE_STD_ZVAL(pt[i]); 
     array_init(pt[i]); 
     add_index_double(pt[i], 0, 1); 
     add_index_zval(return_value, i, pt[i]); 
    } 
} 

मैं कहां से स्मृति pt के लिए आवंटित मुक्त कर देना चाहिए?

उत्तर

6

इस मामले में, आपको यह नहीं करना है। जब आप जिस चर को वापस कर रहे हैं वह नष्ट हो जाता है, इसकी याददाश्त मुक्त हो जाती है। चूंकि आप एक सरणी लौट रहे हैं, इसलिए सरणी के सभी तत्व उस समय भी नष्ट हो जाएंगे (अधिक सटीक होने के लिए, सरणी हटा दिए जाने पर उनकी संदर्भ संख्या कम हो जाती है, केवल तभी जब उनके पास कोई अन्य संदर्भ नहीं होगा वे मुक्त हो जाते हैं)।

आप zval_ptr_dtor पर कॉल करके एक ज़वाल की संदर्भ संख्या को मैन्युअल रूप से कम कर सकते हैं। जब इसकी संदर्भ संख्या 0 तक पहुंच जाती है, तो यह भी इसकी याददाश्त को मुक्त कर देगा।

तकनीकी रूप से, एक सरणी चर HashTable द्वारा समर्थित है। जब चर नष्ट हो जाता है, तो हैश तालिका भी नष्ट हो जाती है। इसके द्वारा, HashTable से जुड़े "विनाशक कॉलबैक" के रूप में भी कहा जाता है, एक बार हैश तालिका तत्वों के साथ एक तर्क के रूप में। जब आप array_init पर कॉल करते हैं, तो यह विनाशक फ़ंक्शन के रूप में zval_ptr_dtor के साथ हैश तालिका भी बनाता है।

यह भी ध्यान दें कि आप यहां दो स्थानों पर emalloc पर कॉल करते हैं। पहला स्पष्ट है, दूसरा MAKE_STD_ZVAL के माध्यम से है। पहला एक अनावश्यक है, लेकिन यदि आप इसका उपयोग करते हैं, तो आपको efree पर कॉल करना चाहिए इससे पहले कि आपका फ़ंक्शन अन्यथा इसकी स्मृति रिसाव देता है क्योंकि यह किसी भी स्वचालित मेमोरी प्रबंधन तंत्र से संबद्ध नहीं है जैसे कि PHP चर हैं।

+0

मैं 'array_init (pt [i]) को कॉल कर रहा हूं;' MAKE_STD_ZVAL() 'के ठीक बाद, इसे उदाहरण में जोड़ना भूल गया। इसलिए, यदि मैं सही ढंग से समझता हूं, तो मुझे 'emalloc() 'बिल्कुल कॉल नहीं करना चाहिए, क्योंकि' MAKE_STD_ZVAL()' स्मृति आवंटित करने के लिए ज़िम्मेदार है, और जब इसकी संदर्भ संख्या शून्य पर आती है तो स्मृति को हटा दिया जाता है (और ऐसा होना चाहिए जब यह PHP में गुंजाइश से बाहर हो जाता है, अगर इसे केवल एक बार संदर्भित किया जाता है)। – rid

+0

@ राडू हां, 'MAKE_STD_ZVAL' आवंटित (' emalloc' के साथ) zval भी। हालांकि, 'emalloc' के लिए आपका पहला कॉल एक zval आवंटित नहीं कर रहा है, यह 10 zval * की सरणी आवंटित कर रहा है, जो एक ही थिब नहीं है। 'वास्तविक' की तरह, आप इसके लिए एक स्थानीय चर का उपयोग कर सकते हैं, या आप सरणी को पूरी तरह से छोड़ सकते हैं और कर सकते हैं:' {zval * zv; MAKE_STD_ZVAL (ZV); add_index_double (zv, 0, 1); add_index_zval (return_value, i, zv); } '। – Artefacto

1

इस मामले में emalloc का उपयोग कर स्मृति को आबंटित करने के लिए, बस zval *pt[10] का उपयोग करें या एक पुन: प्रयोज्य zval करने के लिए इसे कम करने, MAKE_STD_ZVAL सभी स्मृति संभाल लेंगे (डी) आवंटन और संदर्भ गिनती सामान की जरूरत नहीं है।

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