2008-10-23 8 views
10

क्या एटएक्सिट() फ़ंक्शन में मेमोरी को खाली करने का कोई मतलब है?एक एटएक्सिट में फ्रीिंग()

मेरे पास एक वैश्विक चर है जो स्टार्टअप के बाद malloc'ed हो जाता है। मैं इसे मुक्त करने के लिए एक अचूक() फ़ंक्शन लिख सकता हूं, लेकिन क्या प्रोग्राम उस स्मृति को पुनः प्राप्त करने वाला नहीं है जब प्रोग्राम वैसे भी निकलता है?

क्या साफ-सफाई और सक्रिय रूप से इसे साफ करने का कोई लाभ है?

+0

डुप्ली की तरह लगता है, http://stackoverflow.com/questions/2213627/when-you- बाहर निकलने-एसी-आवेदन-है-malloc एड-स्मृति-स्वचालित रूप से मुक्त कर दिया। – unwind

उत्तर

19

सी में नहीं - यह आपके चारों ओर डूबते समय डेक कुर्सियों को पुनर्व्यवस्थित करने जैसा है।

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

10

सभी आधुनिक ऑपरेटिंग सिस्टम में, आप सुरक्षित रूप से मान सकते हैं कि कार्यक्रम समाप्त होने पर सभी मेमोरी मुक्त हो जाएंगी।

+2

+1 यह इंगित करने के लिए कि यह ऑपरेटिंग सिस्टम की एक विशेषता है, न कि भाषा। – unwind

12

इसे मुक्त करने पर एक लाभ यह है कि यदि आप कभी भी स्मृति मेमोरी रिसाव परीक्षण करते हैं जो प्रक्रिया के जीवनकाल में विलोपन के साथ आवंटन से मेल खाता है तो आपको इस तरह के जानबूझकर रिसाव से झूठी सकारात्मक नहीं मिलेगी।

+0

स्मृति रिसाव परीक्षण के बारे में बात करना: http://valgrind.org। – JesperE

+0

atexit() क्लीनअप को कॉल करने से पहले स्मृति रिसाव परीक्षण करने के लिए शुद्ध शुद्ध करें। यह कष्टप्रद था। लेकिन यह एक दशक पहले भी था - तब से यह बदल सकता था। –

2

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

4

आपको मुक्त() अगर आपका कोड atexit() पर कॉल कर रहा है, तो गतिशील रूप से लोड की गई साझा लाइब्रेरी का हिस्सा है (उदाहरण के लिए, dlopen() के साथ)। इस मामले में अतुलनीय हैंडलर को dlclose() समय पर बुलाया जाएगा ताकि उपयोग की शेष प्रक्रिया के लिए ढेर जारी रहेगा।

10

malloc()/free() के रूप में देखकर आम तौर पर उपयोगकर्ता डेटा में मौजूद व्यापक डेटा संरचनाएं शामिल होती हैं, free() आईएनजी मेमोरी जब आपका प्रोग्राम समाप्त होता है तो वास्तव में एक प्रदर्शन नाली हो सकता है। यदि डेटा संरचना के कुछ हिस्सों को डिस्क पर पेजित किया गया है, तो उन्हें केवल डिस्क से लोड करने की आवश्यकता है!

जबकि यदि आप free() आईएनजी के बिना समाप्त कर देते हैं, तो डिस्क पर पेजित डेटा शांति में मर सकता है।

पाठ्यक्रम free() अन्य समय में ING के

आगे malloc() रों अंतरिक्ष आप को मुक्त कर दिया फिर से उपयोग कर सकते हैं और यहां तक ​​कि कुछ free() स्मृति जो तब अन्य प्रक्रियाओं के द्वारा इस्तेमाल किया जा सकता unmap सकता है के रूप में आम तौर पर फायदेमंद है।

1

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

5

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

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

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

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

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