जब प्रोग्राम से बाहर निकलता है तो क्या लीक की गई मेमोरी फ़्री हो जाती है?


117

अगर मैंने प्रोग्राम किया है - बिना यह जाने - एक मेमोरी लीक, और एप्लिकेशन समाप्त हो गया है, तो क्या लीक हुई मेमोरी मुक्त हो गई है?


बहुत उपयोगी, संबंधित जवाब: unix.stackexchange.com/questions/275184/…
गेब्रियल स्टेपल्स

जवाबों:


151

हां, एक "मेमोरी लीक" बस एक ऐसी मेमोरी है जो अब एक प्रक्रिया का संदर्भ नहीं है, और इस तरह अब मुक्त नहीं हो सकती है। ओएस अभी भी एक प्रक्रिया को आवंटित सभी मेमोरी का ट्रैक रखता है, और जब यह प्रक्रिया समाप्त हो जाती है तो इसे मुक्त कर देगा।

अधिकांश मामलों में ओएस मेमोरी को मुक्त कर देगा - जैसा कि विंडोज, लिनक्स, सोलारिस, आदि के सामान्य "जायके" के साथ होता है, हालांकि यह ध्यान रखना महत्वपूर्ण है कि विशेष वातावरण में जैसे कि विभिन्न रियल-टाइम ऑपरेटिंग सिस्टम। कार्यक्रम समाप्त होने पर स्मृति को मुक्त नहीं किया जा सकता है।


4
प्रश्न: क्या ओएस सभी आवंटन का ट्रैक रखता है? आपके द्वारा आवंटित कोई भी ढेर स्मृति प्रक्रिया की आभासी मेमोरी स्पेस से आती है - जब प्रक्रिया समाप्त हो जाती है, तो उस स्थान को सिस्टम थोक में वापस दिया जाता है, है ना? मैं यह नहीं देखता कि अतिरिक्त बहीखाता क्यों आवश्यक होगा, क्योंकि आवंटन करने की प्रक्रिया वैसे भी उन पृष्ठों तक पहुँचने के साथ ही (उपयोगकर्ताभूमि में) प्रक्रिया है। या मुझे गलत शिक्षा दी गई है?
क्रिस टोंकिंसन

6
@ जस्टिन: ओएस को जाने बिना मुझे नहीं लगता कि यह वैध है। शायद आप जिस ओएस के बारे में बात कर रहे हैं उसे स्पष्ट रूप से निर्दिष्ट करें।
ब्रायन आर। बॉन्डी

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

5
छोटे उपकरणों के लिए और इसके बाद के विभिन्न रियल-टाइम ओएस हैं जो लीक में खोई हुई स्मृति को पुनः प्राप्त नहीं करते हैं। आपका प्रश्न उस OS पर निर्भर करता है जिसके बारे में आप बात कर रहे हैं।
ब्रायन नील

14
यहां तक ​​कि विशिष्ट मेमोरी संरक्षित ऑपरेटिंग सिस्टम के साथ, आपको अभी भी "लीक" को परिभाषित करने की आवश्यकता है। अनुप्रयोगों के लिए अपने स्वयं के मेमोरी स्पेस के बाहर "सिस्टम" संसाधनों को आवंटित करना बहुत संभव है (विंडोज दुनिया में इन्हें पहचानने के लिए हैंडल का उपयोग अक्सर किया जाता है)। अपने आवेदन को बंद करना हमेशा सुनिश्चित नहीं करता है कि इस प्रकार के संसाधन जारी किए जाएं।
डेविड

34

आपके प्रोग्राम को निष्पादित करने वाला ओएस आमतौर पर ऐसी मेमोरी को क्लीनअप करता है जिसे स्पष्ट रूप से मुक्त नहीं किया गया है और जो हैंडल स्पष्ट रूप से बंद नहीं है, लेकिन यह सी ++ मानक द्वारा गारंटी नहीं है। आपको कुछ एम्बेडेड डिवाइस मिल सकते हैं जो आपकी मेमोरी लीक से मुक्त नहीं करते हैं।

कहा जा रहा है कि विंडोज और लिनक्स के सभी डिस्ट्रोस जो मैंने कभी देखा है, मेमोरी लीक से मुक्त है।

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


C ++ का उपयोग करते समय एक और विचार यह है कि यदि आप अपनी ढेर आवंटित स्मृति को नहीं हटा रहे हैं तो आपके विध्वंसक भी नहीं कहे जा रहे हैं। यदि आपके विध्वंसक नहीं कहे जाते हैं तो कभी-कभी आपके अन्य दुष्प्रभाव भी होंगे।


14

क्या आप डेस्कटॉप ओएस (विंडोज, लिनक्स आदि) पर चल रहे हैं? यदि ऐसा है, तो हाँ, सामान्य रूप से सिस्टम प्रोग्राम से बाहर होने पर प्रोग्राम से जुड़ी किसी भी मेमोरी को मुक्त कर देगा।


10

आमतौर पर, हाँ। कुछ सिस्टम साझा मेमोरी ब्लॉक जैसी चीजों का समर्थन करते हैं जो प्रोग्राम से बाहर निकलने पर स्वचालित रूप से मुक्त नहीं होते हैं। अधिकांश अभी भी एक संदर्भ गणना रखते हैं और इसे हटा देते हैं जब सभी प्रोग्राम जो इसे बाहर निकलते हैं, लेकिन कुछ नहीं करते हैं (उदाहरण के लिए, 16-बिट विंडोज में कुछ प्रकार के आइटम थे जो तब भी आवंटित किए जाते रहेंगे, जब उन्हें संदर्भित नहीं किया जाता है - हालांकि यह आमतौर पर अन्य कारणों के लिए दुर्घटनाग्रस्त हो गया इससे पहले कि यह एक समस्या का कारण बन जाए ...)


5

जहां तक ​​मुझे पता है, एक आधुनिक ऑपरेटिंग सिस्टम प्रोग्राम समाप्त होने के बाद इस मेमोरी को मुक्त कर देगा।


4

इस बात पर निर्भर करता है कि आपने कौन सी मेमोरी लीक की है। कुछ मेमोरी OS द्वारा पुनः प्राप्त नहीं की जा सकती हैं। जब प्रक्रिया समाप्त हो जाती है तो अधिकांश OSes पर अधिकांश मेमोरी स्वचालित रूप से पुनः प्राप्त हो जाएगी।


6
कुछ मेमोरी OS द्वारा पुनः प्राप्त नहीं की जा सकती हैं - जैसे कि क्या?

2
कुछ वास्तविक समय के ओएस पर, मैंने विशेष ईथरनेट बफ़र ब्लॉक देखे हैं जो एक प्रक्रिया से बाहर निकलने पर साफ नहीं होते हैं।
ब्रायन नील

1
साझा की गई मेमोरी भी आमतौर पर पुनः प्राप्त नहीं होती है, क्योंकि आप चाहते हैं कि यह क्षणिक प्रक्रियाओं का उपयोग करने के लिए बनी रहे।
ब्रायन नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.