2010-07-23 19 views
11

मेरा प्रोग्राम (एक टेक्स्ट-मोड वेब ब्राउज़र) गतिशील रूप से स्मृति आवंटित कर रहा है।क्या मुझे असामान्य समाप्ति पर आवंटित स्मृति मुक्त करनी चाहिए?

मैं रनटाइम के दौरान नि: शुल्क अनइडेड ब्लॉक करता हूं। और मैं सामान्य समाप्ति से पहले सबकुछ मुक्त करता हूं - ताकि मेमोरी रिसाव चेकर्स मुझे झूठी सकारात्मक न दें (और लचीला होने के लिए प्रमुख रिफैक्टरिंग की आवश्यकता होनी चाहिए)।

अब, मैं क्या करता हूं असामान्य समाप्ति से पहले स्मृति मुक्त कर रहा है। (वर्तमान में, मेरा कार्यक्रम संकेतों पर और विफल mallocs/reallocs के बाद समाप्त हो जाता है।)

मेरा प्रश्न है: यदि आप इस बुरा शैली मानते हैं? क्या मुझे असामान्य समाप्ति पर मुक्त होना चाहिए?

+0

आपकी प्रक्रिया समाप्त होने पर आपकी प्रणाली मेमोरी पुनः प्राप्त करेगी, है ना? –

उत्तर

12

नहीं। मुझे लगता है कि यह पूरी तरह से स्वीकार्य है बस अपने हाथ ऊपर फेंक और ओएस स्मृति को पुनः प्राप्त करने के बाद कार्यक्रम समाप्त हो जाता है यह बताने के लिए। मुझे लगता है कि अगर यह वास्तव में एक असामान्य स्थिति है और इरादा प्रोग्राम समाप्त होने का इरादा है, तो एक अच्छी तरह से व्यवहार कार्यक्रम को किसी भी डिस्क संसाधन/ताले को साफ करना चाहिए, और जितनी जल्दी हो सके बाहर निकलना चाहिए।

4

मेरी राय में दुर्घटनाग्रस्त होने पर स्मृति को मुक्त करना आवश्यक नहीं है। जब आपकी प्रक्रिया समाप्त हो जाती है, तो ओएस स्मृति को पुनः प्राप्त कर लेगा, इसलिए आपको बस बाहर निकलना है।

दूसरी ओर, अन्य संसाधन (उदा खुली फ़ाइलों) बंद किया जाना चाहिए या कम से कम प्लावित - यदि नहीं, तो वे जमा नहीं किया जा सकता है/बफरिंग की वजह से अधूरा संग्रहीत।

0

अपनी प्रक्रिया की असामान्य समाप्ति, स्मृति ब्लॉक कि अन्य प्रक्रियाओं के द्वारा नहीं किया जा सकता (प्रभावी रूप से अर्थ वे स्वतंत्र हैं) करने के लिए नेतृत्व नहीं करता है अगर वे इसे से आवंटित किया गया।

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

यदि आप प्रक्रिया द्वारा व्युत्पन्न/लॉन्च/फोर्क नहीं किया गया है तो पीयरिंग प्रक्रियाएं (उदा। मल्टीमीडिया संसाधनों तक पहुंचने के लिए कई प्रक्रियाओं की सेवा करने वाले बाहरी घटक पर विचार करें), हो सकता है कि आपकी प्रक्रिया को पूरा करने के लिए स्मृति (उदा। बफर) बनाया हो। इन बाहरी घटकों के स्वामित्व की नीति के आधार पर, यह स्मृति सेवा-प्रक्रिया मौत पर मुक्त नहीं हो सकती है।

मैं तुम्हें लेखा परीक्षा सभी स्मृति से पहले और असामान्य समाप्ति परिदृश्यों के बाद किये गये प्रयास करने के लिए सलाह देते हैं।

0

केवल तभी यदि आपका ओएस प्रोग्राम समाप्ति पर स्मृति को पुनः प्राप्त नहीं करता है। डॉस और इसकी 'चिपचिपा स्मृति' ऐसे ओएस का एक उदाहरण है। अधिकांश आधुनिक ओएस पर मुक्त नहीं है() असामान्य समाप्ति पर आईएनजी एक गैर-मुद्दा है।

+0

प्रोग्राम समाप्ति पर डॉस पुन: दावा नहीं करता है? – unbeli

+0

एचआरएम। क्या आप वाकई सच हैं? – Gian

+0

मुझे यकीन है कि यह एमएसडीओएस और सीपी/एम के बीडीओएस के कम से कम एक संस्करण के लिए सच है - उन्हें 'चिपचिपा स्मृति' कहा जाता था, जिसके लिए एक कार्यक्रम अंतरिक्ष आवंटित कर सकता था, और इसे समाप्त होने के बाद भी आवंटित किया गया था। इसके अलावा, एमएसडीओएस में टीएसआर कॉल ने कुछ हासिल किया, लेकिन मैं इसे 'असामान्य समाप्ति' नहीं मानूंगा। –

0

नहीं, जब तक कि आपका प्रोग्राम हमेशा असामान्य रूप से समाप्त नहीं हो जाता। :) वैसे भी, ओएस इसे ठीक करने के लिए एक अच्छी नौकरी करता है। असल में कई आलसी प्रोग्रामर सामान्य समाप्ति के साथ चीजों को मुक्त करने से भी परेशान नहीं होते हैं - लेकिन यह अन्य स्मृति रिसावों को मुश्किल बनाता है (जो वास्तविक समस्या हैं)।

3

आपको की आवश्यकता नहीं है, सामान्य समाप्ति पर स्मृति को पुनः प्राप्त करने के लिए, रिसाव का पता लगाने वाले उपकरणों में झूठी सकारात्मकताओं को छोड़कर।

यदि आपका प्रोग्राम असामान्य रूप से समाप्त हो जाता है, तो कारण के आधार पर, आप पाते हैं कि निःशुल्क मेमोरी नहीं हो सकता है। उदाहरण के लिए, एक भ्रष्ट ढेर के परिणामस्वरूप एक एसआईजीएसईजीवी का मतलब है कि ढेर पर अन्य सामान मुक्त करने की भी कोशिश करना शायद एक निराशाजनक व्यायाम है।

0

असामान्य समाप्ति पर आप जितना संभव हो उतना कम प्रसंस्करण करना चाहते हैं। निरस्त करने वाली प्रक्रिया के साथ टिंकरिंग को कम करने का मतलब यह होगा कि आप जितना संभव हो सके निरस्त करने के कारण के करीब पहुंच सकते हैं और किसी और प्रक्रिया को प्रक्रिया को "दूषित" के रूप में देखा जा सकता है जिससे डीबग करना अधिक कठिन हो जाता है।

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