2010-06-04 17 views

उत्तर

78

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

अद्यतन

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

+2

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

+5

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

+1

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

19

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

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

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


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

9

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

1

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

+5

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

+1

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

+1

साझा स्मृति को आमतौर पर पुनः दावा नहीं किया जाता है, क्योंकि आप इसे क्षणिक प्रक्रियाओं के उपयोग के लिए जारी रखना चाहते हैं। –

1

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

5

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

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