2008-12-07 12 views
14

मेरे पास एक तकनीकी प्रश्न है। यह उचित कोडिंग के बारे में कोई सवाल नहीं है।क्या कार्यक्रम से बाहर निकलने वाली वस्तु को वास्तव में आवश्यक है?

मेरा प्रश्न तकनीकी रूप से एक कार्यक्रम से बाहर निकलने/बंद करने की आवश्यकता पर वस्तुओं को जारी कर रहा है?

दूसरे शब्दों में, तर्क के लिए कहें, आपके पास एक बटन है जो आपके आवेदन को बंद कर देता है, लेकिन आप बंद करने से ठीक पहले एक छवि प्रदर्शित करते हैं, और फिर आप एप्लिकेशन को बंद कर देते हैं।

क्या आपको तकनीकी बंद करने से पहले उस छवि दृश्य को रिलीज़ करने की आवश्यकता है? जब प्रोग्राम निकलता है, तो स्मृति स्वचालित रूप से मुक्त हो जाएगी, या यदि आप इसे रिलीज़ नहीं करते हैं तो स्मृति किसी भी तरह से "सक्रिय" रहेगी?

मैं समझता हूं कि आपको इसे "जारी करना" चाहिए, मेरा प्रश्न तकनीकी पक्ष के बारे में है, और दृश्यों के पीछे क्या होता है।

धन्यवाद।

उत्तर

26

यह आवश्यक नहीं है। लेकिन यदि आप valgrind या इसी तरह के टूल का उपयोग कर रहे हैं, तो आपको जल्द ही पता चलेगा कि आपकी सारी याददाश्त आपको झूठी चेतावनियों से लटकती है।

चीजों के लिनक्स पक्ष पर, ढेर sbrk सिस्टम कॉल का उपयोग करके उगाया जाता है। यह एक समय में एक बड़े ब्लॉक द्वारा समग्र प्रोसेसर मेमोरी स्पेस बढ़ाता है (इसलिए malloc एस के लिए पर्याप्त जगह प्रदान करने के लिए केवल एक sbrk की आवश्यकता है)। जब प्रक्रिया समाप्त हो जाती है, तो कर्नेल sbrk द्वारा आवंटित सभी मेमोरी को पुनः प्राप्त करता है। यही कारण है कि आप सुरक्षित हैं। कर्नेल उस प्रक्रिया द्वारा खोले गए किसी भी फ़ाइल डिस्क्रिप्टर को भी बंद कर देगा।

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

सारांश में? मेमोरी ठीक है। फाइल डिस्क्रिप्टर आमतौर पर ठीक होते हैं। साफ़ नहीं होने पर कुछ अधिक गूढ़ आईपीसी सुविधाओं को तोड़ दिया जाएगा।

1

वास्तव में यह आवश्यक नहीं है, लेकिन यदि आप अपने स्रोत को रीसायकल करना चाहते हैं और इसे किसी अन्य प्रोग्राम में उपयोग करना चाहते हैं, तो आपको मेमोरी लीक मिल सकती है। इसके अलावा, ओएस को किसी भी गलती के बिना कभी नहीं मानें। यह कुछ संसाधनों को मुक्त करने के लिए "भूल" सकता है।

4

आईफोन पर, आपको इसकी आवश्यकता नहीं है, और जहां तक ​​मुझे पता है, आप नहीं कर सकते। आवेदन प्राप्त करने के बाद WillTerminate: आपके राज्य को बचाने के लिए आपके पास कुछ सेकंड हैं और फिर ओएस आपकी प्रक्रिया को मार देता है। नमूना ऐप्स में से एक बनाएं और डेलोक विधियों में से एक में ब्रेकपॉइंट डालें। वे कभी हिट नहीं करते हैं। link text

नोट:: उद्देश्य सी dealloc एक सी ++ Deconstructor रूप में एक ही बात नहीं है

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

0

रिलीज आपको बग खोजने में मदद कर सकता है। गतिशील स्मृति समस्याओं की तुलना में अक्सर रिलीज़ समय पर ट्रिगर नहीं होता है (उदाहरण के लिए, आप एक अवैध ऑब्जेक्ट को रिलीज़ करने का प्रयास करते हैं)।हमेशा रिलीज करने से आप उन बगों की पहचान करने में मदद कर सकते हैं जो अन्यथा ढूंढना मुश्किल होगा।

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