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