यह कुछ ऐसा है जो मुझे अब उम्र के लिए परेशान कर रहा है।
हम सभी को स्कूल में पढ़ाया जाता है (कम से कम, मैं था) कि आपको आवंटित किए जाने वाले हर सूचक को मुक्त करना होगा। मैं थोड़ा उत्सुक हूं, हालांकि, स्मृति को मुक्त नहीं करने की वास्तविक लागत के बारे में। कुछ स्पष्ट मामलों में, जैसे कि जब malloc
लूप के अंदर कॉल किया जाता है या थ्रेड निष्पादन का हिस्सा होता है, तो इसे मुक्त करना बहुत महत्वपूर्ण है ताकि कोई मेमोरी लीक न हो। लेकिन निम्नलिखित दो उदाहरणों पर विचार करें:
पहला, अगर मेरे पास कोड है जो कुछ इस तरह है:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
यहाँ वास्तविक परिणाम क्या है? मेरी सोच यह है कि प्रक्रिया मर जाती है और फिर ढेर स्थान वैसे भी चला जाता है इसलिए कॉल को गायब करने में कोई नुकसान नहीं है free
(हालांकि, मैं इसे बंद करने, बनाए रखने और अच्छे अभ्यास के लिए वैसे भी होने के महत्व को पहचानता हूं)। क्या मैं इस सोच में सही हूँ?
दूसरा, मान लीजिए कि मेरे पास एक प्रोग्राम है जो शेल की तरह थोड़ा सा काम करता है। उपयोगकर्ता चर की तरह घोषित कर सकते हैं aaa = 123
और जिन्हें बाद में उपयोग के लिए कुछ गतिशील डेटा संरचना में संग्रहीत किया जाता है। स्पष्ट रूप से, यह स्पष्ट प्रतीत होता है कि आप कुछ समाधान का उपयोग करेंगे जो कुछ * आवंटन फ़ंक्शन (हैशमैप, लिंक की गई सूची, ऐसा कुछ) को कॉल करेगा। इस तरह के कार्यक्रम के लिए, यह कॉल करने के बाद कभी भी मुक्त होने का कोई मतलब नहीं है malloc
क्योंकि ये चर कार्यक्रम के निष्पादन के दौरान हर समय मौजूद रहना चाहिए और इसे सांख्यिकीय रूप से आवंटित स्थान के साथ लागू करने का कोई अच्छा तरीका नहीं है (जिसे मैं देख सकता हूं)। क्या यह खराब डिज़ाइन है कि स्मृति का एक गुच्छा है जो आवंटित किया गया है लेकिन केवल समाप्त होने वाली प्रक्रिया के हिस्से के रूप में मुक्त किया गया है? यदि हां, तो विकल्प क्या है?
free(a)
वास्तव में स्मृति को वास्तव में मुक्त करने के लिए कुछ भी नहीं करना है! यह केवल मॉलोक के परिवाद के कार्यान्वयन में कुछ बिंदुओं को रीसेट करता है जो कि बड़े मिमीपेड मेमोरी पेज (जिसे आमतौर पर "हीप" कहा जाता है) के अंदर मेमोरी की उपलब्ध मात्रा पर नज़र रखता है। वह पृष्ठ अब भी केवल तभी मुक्त किया जाएगा जब आपका कार्यक्रम समाप्त हो जाएगा, इससे पहले नहीं।