ऐसी दो जगहें हैं जहाँ चर को स्मृति में रखा जा सकता है। जब आप इस तरह एक चर बनाते हैं:
int a;
char c;
char d[16];
चर " स्टैक " में बनाए जाते हैं । जब वे दायरे से बाहर हो जाते हैं, तो स्टैक चर स्वचालित रूप से मुक्त हो जाते हैं (जब कोड अब उन तक नहीं पहुंच सकता है)। आपने उन्हें "स्वचालित" चर कहा जा सकता है, लेकिन यह फैशन से बाहर हो गया है।
कई शुरुआती उदाहरण केवल स्टैक चर का उपयोग करेंगे।
स्टैक अच्छा है क्योंकि यह स्वचालित है, लेकिन इसमें दो कमियां भी हैं: (1) कंपाइलर को पहले से पता होना चाहिए कि चर कितने बड़े हैं, और (बी) स्टैक स्थान कुछ सीमित है। उदाहरण के लिए: विंडोज में, माइक्रोसॉफ्ट लिंकर के लिए डिफ़ॉल्ट सेटिंग्स के तहत, स्टैक 1 एमबी पर सेट है, और यह सब आपके चर के लिए उपलब्ध नहीं है।
यदि आप संकलन समय पर नहीं जानते हैं कि आपका सरणी कितना बड़ा है, या यदि आपको बड़े सरणी या संरचना की आवश्यकता है, तो आपको "प्लान बी" की आवश्यकता होगी।
प्लान बी को " हीप " कहा जाता है । आप आमतौर पर वैरिएबल बना सकते हैं जितना बड़ा ऑपरेटिंग सिस्टम आपको देगा, लेकिन आपको इसे स्वयं करना होगा। इससे पहले की पोस्टिंग ने आपको एक ऐसा तरीका दिखाया, जिससे आप इसे कर सकते हैं, हालाँकि अन्य तरीके भी हैं:
int size;
// ...
// Set size to some value, based on information available at run-time. Then:
// ...
char *p = (char *)malloc(size);
(ध्यान दें कि ढेर में चर सीधे जोड़ नहीं हैं, लेकिन संकेत के माध्यम से)
एक बार जब आप एक ढेर चर बनाते हैं, तो समस्या यह है कि संकलक यह नहीं बता सकता है कि आप इसके साथ कब कर रहे हैं, इसलिए आप स्वत: जारी करना खो देते हैं। यही वह जगह है जहाँ "मैनुअल रिलीज़" आप में आने का जिक्र कर रहे थे। आपका कोड अब यह तय करने के लिए ज़िम्मेदार है कि चर की अब और ज़रूरत नहीं है, और इसे रिलीज़ करें ताकि मेमोरी को अन्य उद्देश्यों के लिए लिया जा सके। उपरोक्त मामले के लिए:
free(p);
यह दूसरा विकल्प "गंदा व्यवसाय" बनाता है, यह जानना हमेशा आसान नहीं होता है कि कब चर की आवश्यकता नहीं है। एक चर जारी करने के लिए भूल जाने पर जब आपको इसकी आवश्यकता नहीं होती है तो इससे आपके कार्यक्रम को अधिक मेमोरी का उपभोग करने की आवश्यकता होगी जो इसे करने की आवश्यकता है। इस स्थिति को "रिसाव" कहा जाता है। "लीक" मेमोरी का उपयोग किसी भी चीज के लिए नहीं किया जा सकता है जब तक कि आपका कार्यक्रम समाप्त न हो जाए और ओएस अपने सभी संसाधनों को पुन: प्राप्त कर ले। यहां तक कि नास्टियर समस्याएं भी संभव हैं यदि आप वास्तव में इसके साथ किए जाने से पहले गलती से एक ढेर चर जारी करते हैं।
C और C ++ में, आप अपने हीप वैरिएबल को साफ करने के लिए जिम्मेदार हैं, जैसा कि ऊपर दिखाया गया है। हालाँकि, ऐसी भाषाएँ और वातावरण हैं जैसे जावा और .NET भाषाएँ जैसे C # जो एक अलग दृष्टिकोण का उपयोग करते हैं, जहाँ ढेर अपने आप साफ हो जाता है। "कचरा संग्रह" नामक यह दूसरी विधि, डेवलपर पर बहुत आसान है, लेकिन आप ओवरहेड और प्रदर्शन में जुर्माना का भुगतान करते हैं। यह एक संतुलन है।
(मैंने एक सरल विवरण देने के लिए कई विवरणों पर प्रकाश डाला है, लेकिन उम्मीद है कि अधिक स्तरीय उत्तर)