2009-06-14 21 views
5

संभव डुप्लिकेट:
What REALLY happens when you don’t free after malloc?स्मृति मुक्त करने का महत्व?

जब C/C++ में एक कार्यक्रम को समाप्त, आप संकेत को मुक्त कराने के द्वारा साफ करने के लिए किया है। क्या होता है यदि आप स्मृति को मुक्त नहीं करते हैं, जैसे कि आपके पास एक इंटरेक्ट पॉइंटर है और प्रोग्राम समाप्त होने पर इसे हटा नहीं देता है? क्या स्मृति अभी भी उपयोग की जाती है और इसे फिर से शुरू करके मुक्त किया जा सकता है, या प्रोग्राम समाप्त होने पर यह स्वचालित रूप से मुक्त हो जाता है? और आखिरी मामले में, यह क्यों मुक्त है, अगर ऑपरेटिंग सिस्टम आपके लिए करता है?

+1

डुप्लिकेट: http://stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc –

+1

इसका भी डुप्लिकेट: http://stackoverflow.com/questions/ 347338/आईएस-ऑब्जेक्ट-रिलीज-ऑन-प्रोग्राम-एक्जिट-वास्तव में आवश्यक/34734 9 – Tom

उत्तर

5

जब आपका प्रोग्राम समाप्त होता है तो सभी मेमोरी ऑपरेटिंग सिस्टम द्वारा मुक्त हो जाएंगी।

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

+1

बहुत अच्छी तरह से डाल दिया। अप्रयुक्त स्मृति को मुक्त करने का महत्व (और निश्चित रूप से, उन तरीकों से कार्यान्वित करना जो आपको अनावश्यक स्मृति आवंटन जारी करने की अनुमति देते हैं) लंबे समय तक चलने वाले कार्यक्रमों में महत्वपूर्ण है। यदि आप त्वरित लघु गृह कार्य असाइनमेंट लिख रहे हैं, तो महत्व अकादमिक हितों का है। हालांकि, अगर आप एक बड़ा आवेदन लिख रहे हैं (जैसे फ़ायरफ़ॉक्स - मुझे तर्क पता है, कृपया कोई आग नहीं है) और आप नए मेमोरी हिस्सों को आवंटित करते रहते हैं और पुराने अप्रयुक्त लोगों को मुक्त नहीं करते हैं, तो आप या तो स्मृति से बाहर हो जाएंगे या आपका आवेदन होगा बहुत अधिक संसाधन आवंटन के कारण फेंक दिया जाना चाहिए। – nik

7

जब प्रोग्राम समाप्त होता है, तो सभी मेमोरी (मुक्त या नहीं) ऑपरेटिंग सिस्टम द्वारा पुनः दावा की जाती है। आपके द्वारा आवंटित की गई सभी चीज़ों को मुक्त करने के लिए अभी भी अच्छा अभ्यास है, हालांकि - मुख्य रूप से केवल इसकी आदत में होना, या यदि आप अपना प्रोग्राम बढ़ाते हैं तो यह समाप्त नहीं होता है जहां यह उपयोग किया जाता है।

+1

यह सही है। आपके प्रोग्राम को स्केलेबल होने के लिए, आपको जितनी जल्दी हो सके सबकुछ मुक्त करना चाहिए।यह कभी-कभी कार्यक्रम के अंत में होता है, लेकिन आमतौर पर नहीं। –

5

विंडोज़, लिनक्स या मैकोज़ जैसे डेस्कटॉप ओएस पर, आपकी याददाश्त आपके लिए साफ हो जाएगी।

कुछ वास्तविक समय या एम्बेडेड ऑपरेटिंग सिस्टम पर, यह आपके लिए साफ़ नहीं किया जाएगा।

लेकिन जब आप इसके साथ समाप्त कर चुके हैं तो हमेशा याद रखने के लिए एक अच्छा विचार है - ध्यान रखें कि आपका प्रोग्राम चल रहा है, लेकिन यह स्मृति अभी भी उपयोग में है। यदि आप इसे मुक्त नहीं करते हैं, तो मशीन का मेमोरी उपयोग बढ़ जाएगा।

आपको रीफैक्टरिंग के बारे में भी सावधान रहना होगा - कहें कि आप main() फ़ंक्शन लिखना शुरू करते हैं जो कुछ मेमोरी आवंटित करता है, और आप इसे मुक्त करने से परेशान नहीं हैं क्योंकि ओएस आपके लिए यह करेगा। लेकिन फिर आप उस कोड को उस फ़ंक्शन में ले जाते हैं जिसे कई बार बुलाया जाता है, लंबे समय तक - अचानक आपके पास एक बड़ी मेमोरी लीक होती है।

1

प्रोग्राम समाप्त होने पर ओएस द्वारा स्मृति को मुक्त किया जाता है, लेकिन यदि आपके पास सब कुछ मामूली स्मृति रिसाव है, तो यह आपकी चिंताओं का सबसे कम है।

अधिक समस्याग्रस्त है: 1) यदि यह एक लूप में होता है, तो आपका प्रोग्राम आकार में गुब्बारे और 2) सी ++ में, यदि आपकी "नई" एड ऑब्जेक्ट्स "डिलीट" नहीं होती हैं, तो आपके विनाशक नहीं चल रहे हैं , और इससे अधिक गंभीर समस्याएं हो सकती हैं (म्यूटेक्स लीकिंग, या संसाधनों को लीक करना ओएस द्वारा साफ नहीं किया गया है, डेटा अखंडता के मुद्दों, सूची जारी है)

0

मेमोरी को ठीक से मुक्त करना महत्वपूर्ण है ताकि उपकरण जब आपको समस्याओं को ट्रैक करने की आवश्यकता होती है तो आपको स्मृति लीक का सार्थक आउटपुट मिलेगा। आपके लिए स्मृति को मुक्त करने के लिए ओएस को अनुमति देने से आप किसी भी विश्लेषणात्मक टूल को अतिरिक्त शोर जोड़ देंगे जिसका आप बाद में उपयोग कर सकते हैं। यहां तक ​​कि यदि ओएस सिस्टम को स्मृति देता है तो आपके पास एक रॉक ठोस डिजाइन होना चाहिए जो उचित तरीके से स्मृति का उपयोग करता है और आपको उपकरणों का सबसे अच्छा उपयोग करने की अनुमति देता है।

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