2011-07-14 10 views
8

मैं निम्नलिखित उद्धरण में आए "Desctructors के नाम से जाना गारंटी नहीं है।" और यह मुझे थोड़ा डराता है।Destructors के नाम से जाना गारंटी नहीं दी जाती

यह कहता है कि आखिर में एक कोशिश भी अवरुद्ध हो सकती है, जिससे स्मृति रिसाव हो सकती है। यह आपके कोड को सीईआर (बाधित निष्पादन क्षेत्र) में रखकर या CriticalFinalizerObject से प्राप्त करके समाधान प्रदान करता है।

मेरा प्रश्न

  1. यदि कोई CriticalFinalizerObject का उपयोग करके tradoffs क्या कर रहे हैं, है?
  2. हैं उनके किसी भी मामले तुम सच में उपयोगी था CriticalFinalizerObject से पाने पाया गया?
  3. मैं केवल इस का उपयोग करते हुए जब मैं मेमोरी लीक में प्रदर्शित होना आरंभ हो के बारे में चिंता करनी चाहिए?
+10

मुझे नहीं लगता कि आप इस बारे में बिल्कुल भी चिंता करनी चाहिए है। –

+2

क्या आप हमें स्रोत के लिए लिंक दे सकते हैं। –

+0

@ जेथ्रो: 'कोशिश/आखिरकार' बाधित नहीं किया जा सकता है, आखिरकार कोड _always_ रन होगा .. –

उत्तर

3

आप desctructors पर भरोसा क्यों कर रहे हैं? ज्यादातर समय आपको उनकी कोई आवश्यकता नहीं होती है।

शायद IDisposeable और निपटान पैटर्न पर एक नज़र डालें।

यहाँ

कुछ लिंक है कि मुझे helpes इस विषय को समझने के लिए

->Everybody thinks about garbage collection the wrong way

->How To implement dispose Pattern

->Implementing Finalize and Dispose to Clean Up Unmanaged Resources

+0

मुझे पता है कि आईडीस्पोजेबल क्लास क्या करता है और इसका उपयोग कैसे किया जाता है, लेकिन जैसा कि मेरी पोस्ट राज्यों को बरकरार रखती है, यह बाधित हो सकती है, मेमोरी लीक का कारण बनता है। – Jethro

+0

ठीक है। लेकिन इस मामले को अन्य {} अंत में {} ब्लॉक के साथ दूसरे पोस्ट में उल्लिखित उदाहरण के लिए स्पष्ट रूप से संभाला जाना चाहिए। रेमोंग चेन की तरह कहते हैं: >> एक सही ढंग से लिखित प्रोग्राम यह नहीं मान सकता कि फाइनलर कभी भी चलेंगे। << –

+0

मैं "अप्रबंधित संसाधनों को कैसे साफ नहीं करना है" के लिए अपना अंतिम लिंक नाम दूंगा। अप्रबंधित संसाधन एक ऐसी चीज हैं जो महत्वपूर्ण अंतिमकरण का उपयोग करनी चाहिए। – CodesInChaos

0

मैं सभी संसाधनों के लिए IDisposable इंटरफ़ेस का उपयोग कर सुझाव है कि नष्ट करने की जरूरत है, और using ब्लॉक में उनका उपयोग करें।

+2

तो, 'उपयोग' ब्लॉक (तकनीकी रूप से) अंततः प्रयास से अलग कैसे है? (हाँ, यह सवाल अशिष्ट है।) – Heinzi

+2

यह सहायक नहीं है। 'उपयोग' 'कोशिश/आखिरकार 'के लिए सिर्फ वाक्य रचनात्मक चीनी है। –

1

के बारे में प्रश्न # 3: मेमोरी लीक आम तौर पर कारण हो जाएगा द्वारा:

  • अप्रबंधित संसाधन बंद नहीं किया जा रहा। उन लोगों के लिए, IDISposable का उपयोग करके (फाइनल में निपटान() को फ़ॉलबैक कॉल के साथ) सबसे अच्छा तरीका है।

  • प्रबंधित वस्तुओं के संदर्भ बनाए रखा जाता है क्योंकि अन्य ऑब्जेक्ट्स अभी भी उन्हें इंगित करते हैं, भले ही उन्हें हटाया जाना चाहिए। आईएचएमओ, कचरा संग्रह के साथ निम्न स्तर के मुद्दे की तुलना में कोड गुणवत्ता की एक समस्या है।

जब तक आप वास्तविक मेमोरी लीक में चलाने, आप भी इसके बारे में चिंता नहीं करनी चाहिए, और किसी भी व्यवहार के लिए मजबूर करने की कोशिश नहीं।

+0

जो सामान्य उत्तर प्रतीत होता है मुझे फॉर्म लोग मिल रहे हैं। आपके उत्तर के लिए धन्यवाद। – Jethro

0

आमतौर पर सामान्य फ़ाइनलाइजर्स और महत्वपूर्ण फ़ाइनेंजर्स के बीच अंतर केवल ऐपडोमेन अनलोड पर महत्वपूर्ण हो जाते हैं। चूंकि अधिकांश अप्रबंधित संसाधन स्वचालित रूप से प्रक्रिया अनलोड पर जाते हैं, इसलिए आमतौर पर प्रक्रिया को चालू रखते हुए AppDomain एस को अनलोड करना चाहते हैं, तो आपको केवल महत्वपूर्ण अंतिमकरण के बारे में चिंता करने की आवश्यकता होती है।

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