2013-04-08 7 views
6

मान लीजिए कि मैं कुछ पॉइंटर्स में कुछ मेमोरी malloc लेकिन कार्यक्रम से बाहर निकलने से पहले उन्हें मुक्त नहीं करते हैं। क्या यह स्मृति स्वचालित रूप से बाहर निकलने पर मुक्त हो जाती है या जब तक मैं कंप्यूटर को पुनरारंभ नहीं करता तब तक स्मृति रिसाव तब तक जारी रहेगा?क्या कार्यक्रम निकलता है जब ढेर मुक्त हो जाता है?

+1

[इस] (http://stackoverflow.com/questions/2215259/will-malloc-implementations-return-free-ed-memory-back-to-the-system) और [यह] (http: //stackoverflow.com/questions/654754/what-really-happens-when-you-dont-free-after-malloc) भी। –

उत्तर

5

उत्तर अक्सर होता है।

ढेर को मुक्त करना ओएस की जिम्मेदारी है। जबकि अधिकांश ओएस (विशेष रूप से मुख्यधारा ओएस) बाहर निकलने पर ढेर को मुक्त करता है, यह एम्बेडेड सिस्टम ओएस कहने के लिए जरूरी नहीं है।

जब आप ढेर पर आवंटित स्मृति के लिए कॉल करते हैं, तो इस स्मृति को प्रदान करने के लिए ओएस के कर्नेल स्पेस में एक सिस्टम कॉल किया जाता है। यह मेमोरी आपकी प्रक्रिया संरचना में मैप की गई है, जिसे ओएस द्वारा बनाए रखा जाता है। जब आपका प्रोग्राम निकलता है, ओएस एक साफ अप रूटिंग के माध्यम से जाता है, सभी फाइल डिस्क्रिप्टर बंद करता है, और अन्य मेमोरी (अन्य चीजों के साथ) आवंटन के लिए इस मेमोरी को मुक्त करता है।

इनमें से कुछ उत्तर यह कहकर गलत हैं कि यह संकलक निर्भर है। कंपाइलर यह नहीं कहता है 'हे इस कार्यक्रम को बाहर निकलने पर इस स्मृति को मुक्त करें'। यह समझ में नहीं आता है, क्या होता है यदि ओएस अप्रत्याशित रूप से प्रोग्राम को समाप्त कर देता है? नहीं, संकलक सिस्टम उत्पन्न करने के लिए ज़िम्मेदार है जब भी स्मृति आवंटन/डीलोकेशन स्पष्ट रूप से ढेर के लिए अनुरोध किया जाता है।

1

प्रक्रिया समाप्त होने पर कोई भी आधुनिक डेस्कटॉप ऑपरेटिंग सिस्टम संसाधनों को पुनः प्राप्त करेगा। कोई स्मृति रिसाव नहीं होगा।

2

मेमोरी आपके प्रोग्राम या libc द्वारा मुक्त नहीं किया जाएगा, लेकिन सभी आधुनिक ऑपरेटिंग सिस्टम पर ऑपरेटिंग सिस्टम द्वारा मुक्त किया जाएगा। वे विशिष्ट प्रक्रियाओं को स्मृति आवंटित करते हैं और प्रक्रिया समाप्त होने पर स्मृति को साफ करते हैं।

+0

सभी ऑपरेटिंग सिस्टम ऐसा नहीं करेंगे। – 75inchpianist

1

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

1

यदि आप सी मानक देखते हैं, तो यह कार्यान्वयन विशिष्ट है ताकि आप इसके बारे में सुनिश्चित न हों।

लेकिन प्रक्रिया समाप्त होने के बाद अधिकांश ओएस स्मृति को मुक्त कर देगा, लेकिन यह कुछ छोटे/सरल प्लेटफ़ॉर्म पर मामला नहीं हो सकता है।

1

यह एक प्रश्न नहीं है। ढेर कैसे लागू किया जाता है संकलक पर निर्भर करता है और एक कार्यक्रम के बाहर ओएस क्या करता है। जब कोई प्रोग्राम निकलता है तो मेरे ज्ञान के लिए सभी आधुनिक ओएस मुक्त मेमोरी संसाधन। यह कुछ एम्बेडेड सिस्टम या ड्राइवरों पर सच नहीं हो सकता है।

+0

कार्यक्रम से बाहर निकलने के बाद ढेर को मुक्त किया जाता है संकलक से स्वतंत्र होता है। यह एक ओएस मुद्दा है। – 75inchpianist

+0

हाँ, जो मैंने कहने की कोशिश की। लेकिन अच्छी तरह से नहीं। शिकायतकर्ता ने कुछ कहा है कि ढेर कैसे लागू किए जाते हैं। आपके पास ओएस पर सी प्रोग्राम हो सकते हैं जिनमें वर्चुअल एड्रेस स्पेस या मेमोरी मैनेजमेंट नहीं है। सभी आधुनिक प्रत्यारोपण पर संकलक सिस्टम कॉल को कॉल अग्रेषित करता है लेकिन यह आवश्यक नहीं है – rerun

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