2010-03-25 18 views
15

क्रैश करता है यदि ऐप क्रैश हो जाता है तो क्या एक विनाशक को बुलाया जाता है? यदि यह एक अनचाहे अपवाद है, तो मैं अनुमान लगा रहा हूं कि यह करता है, लेकिन अधिक गंभीर त्रुटियों के बारे में क्या है, या उपयोगकर्ता की प्रक्रिया की प्रक्रिया को मारने की तरह कुछ?विनाशक - क्या ऐप क्रैश हो जाता है यदि ऐप

और कुछ और संभावित रूप से गूंगा सवाल:

  • क्या कोई एप्लिकेशन में सभी वस्तुओं को जब अनुप्रयोग बाहर निकलता है और सभी finalizers बाद मार दिया करने के लिए होता है - वस्तुओं कचरा एकत्र मिलता है या वे सभी किसी न किसी तरह कर रहे हैं करते हैं " प्रक्रिया या appdomain के साथ "unloaded"?
  • प्रत्येक एप्लिकेशन का कचरा कलेक्टर हिस्सा है (उसी प्रक्रिया में चलता है) या यह स्वतंत्र है?
+1

किस तरह का दुर्घटना? अपवाद एक दुर्घटना नहीं है, लेकिन पुनर्प्राप्ति योग्य त्रुटियां हैं। – Dykam

उत्तर

21

मैं आपको अपने लिए यह कोशिश करने के लिए प्रोत्साहित करता हूं। उदाहरण के लिए:

using System; 

class Program { 
    static void Main(string[] args) { 
    var t = new Test(); 
    throw new Exception("kaboom"); 
    } 
} 
class Test { 
    ~Test() { Console.WriteLine("finalizer called"); } 
} 

कमांड प्रॉम्प्ट पर इसे चलाएं ताकि आप अंतिम गैस देख सकें। सबसे पहले फेंक बयान के साथ टिप्पणी की।

विंडोज़ में किसी भी अनचाहे अपवाद की तरह, विंडोज़ डिफ़ॉल्ट डिफॉल्ट फ़िल्टर जो विंडोज़ त्रुटि रिपोर्टिंग संवाद को आमंत्रित करता है, जिसे WerFault.exe द्वारा प्रदर्शित किया जाता है। यदि आप "प्रोग्राम बंद करें" पर क्लिक करते हैं, तो प्रोग्राम को मारने के लिए WerFault TerminateProcess() का उपयोग करेगा। यह एक त्वरित अंत है, फाइनलज़र थ्रेड चलाने का कोई मौका नहीं है, जैसा कि एक प्रोग्राम सामान्य रूप से बाहर निकलता है।

विंडोज़ तब शर्पनेल को साफ करने का ख्याल रखता है। यह आपके प्रोग्राम को खोले जाने वाले किसी भी ऑपरेटिंग सिस्टम को स्वचालित रूप से बंद कर देता है लेकिन अंतिम रूप में बंद करने का मौका नहीं मिला। फ़ाइलें यहां सबसे कठिन समस्या है, उनके बफर फ्लश नहीं होते हैं और आप डिस्क पर आंशिक रूप से लिखित फ़ाइल के साथ आसानी से समाप्त हो जाएंगे।

+1

+1। Thx, बहुत जानकारीपूर्ण। मैं निश्चित रूप से यह और कुछ अन्य विचारों को यह देखने का प्रयास करूंगा कि क्या हो रहा है। – anakic

4

मुझे सी # भी नहीं पता है, लेकिन अन्य प्रोग्रामिंग भाषाओं के साथ अपने अनुभवों के आधार पर मुझे लगता है: यदि कोई ऐप दुर्घटनाग्रस्त हो जाता है, तो इसका मतलब है कि इसमें कुछ गंभीरता से गलत है। गलत मेमोरी हैंडलिंग इत्यादि। इस तरह के मामले में विनाशकों/डेलोकॉटर/फाइनलाइजर्स/... को निष्पादित करने की कोशिश करने के लिए किसी भी प्रोग्रामिंग भाषा के लिए यह अजीब होगा। हालात शायद सिर्फ अधिक गलत जाना होगा;)

अद्यतन: (फिर से, नहीं # विशिष्ट सी अपने अन्य सवालों के जवाब देने) की कोशिश करना भूल गया, लेकिन आम तौर पर कोई गारंटी नहीं है कि विनाशकर्ता/deallocators/finalizers/... वास्तव में बुलाया जाता है। इसका कारण यह है कि जब कोई प्रक्रिया छोड़ती है तो स्मृति को साफ करने के लिए प्रक्रियाओं के लिए उपयोग किए जाने वाले मेमोरी ब्लॉक को बस "ज़ैप" करने के लिए अधिक आसान और अधिक कुशल होता है।

मुझे यकीन नहीं है कि बहुत अधिक तकनीकी विवरण के बिना आपके अंतिम प्रश्न का उत्तर कैसे दिया जाए। ऐसे कई तरीके हैं जिनमें कचरा कलेक्टरों को डिज़ाइन और चलाने के लिए बनाया जा सकता है, सबसे आसान यह है कि कचरा संग्रह वर्तमान प्रक्रिया को रोकता है और इसे पूरा होने पर जारी रहता है, हालांकि यह भी संभव है (लेकिन अधिक कठिन) कचरा कलेक्टरों के साथ जो एक साथ चलते हैं उन प्रक्रियाओं के साथ जिनकी स्मृति वे एकत्र कर रहे हैं।

आप इन सभी को बेहतर ढंग से समझने के लिए कचरा संग्रहण सिद्धांत पर पढ़ना चाह सकते हैं। वास्तव में इस विषय के बारे में एक पूरी साइट है: www.memorymanagement.org

+0

Thx, अच्छा जवाब।लेकिन 1 चीज सही नहीं लगती है - आप कहते हैं कि यदि ऐप सामान्य रूप से बाहर निकलता है, तो कुछ विनाशकों को अभी भी बुलाया नहीं जा सकता है ... यह मेरे लिए सही नहीं लगता है, क्योंकि कचरा कलेक्टर या किसी के लिए कोई रास्ता नहीं है अन्यथा (लेकिन वस्तुओं को स्वयं) यह जानने के लिए कि किस प्रकार के मूल संसाधनों ने एप्लिकेशन की प्रबंधित वस्तुओं का उपयोग किया हो, इसलिए यह इसे संभाल नहीं सकता है। वैसे भी मैं इसे आज़मा दूंगा, जैसे कि महारानी परेशान होती है, और जब मुझे थोड़ा समय मिलता है तो परिणाम पोस्ट करें ... – anakic

+0

मैं वास्तव में सी # के लिए नहीं कह सकता, लेकिन उद्देश्य-सी यहां एक दिलचस्प उदाहरण प्रदान करता है। आपको 'dealloc' (जो कि जीसी बंद होने पर विनाशकारी है) के लिए प्रलेखन की तुलना करनी चाहिए और 'अंतिमकरण' (जब जीसी चालू है)। 'Dealloc' के लिए, दस्तावेज़ बहुत स्पष्ट रूप से कहते हैं कि इसकी कोई गारंटी नहीं है कि इसे बुलाया जाएगा और आपको उस पर भरोसा नहीं करना चाहिए उदाहरण के लिए फ़ाइल बंद करें। 'अंतिम रूप देने' के लिए, दस्तावेज़ों को अस्पष्ट हैं, ऐसा लगता है कि आप फ़ाइल को बंद करने के लिए 'बैकअप' के रूप में 'अंतिम रूप' पर भरोसा कर सकते हैं, लेकिन मुझे एक वाक्य नहीं मिल रहा है जो स्पष्ट रूप से 'अंतिमकरण' कहता है बुलाया जाने की गारंटी है। – Rinzwind

+0

उद्देश्य-सी में 'dealloc' और 'finalize' के लिए प्रलेखन का एक लिंक यहां दिया गया है। बीटीडब्लू: यह देखने के लिए कि क्या इन्हें सी # में बुलाया जाता है, यह देखने के लिए प्रयोग करने की कोशिश कर रहा है, आपको दस्तावेज़ीकरण को भी देखना चाहिए। यदि आपका प्रयोग दिखाता है कि इसे कॉल किया जाता है, लेकिन दस्तावेज़ यह नहीं कहते हैं कि * गारंटी * है तो यह भविष्य के संस्करणों या अन्य प्लेटफ़ॉर्म पर बदला जा सकता है, इसलिए आप इससे बेहतर भरोसा नहीं करेंगे। ओब्जे-सी डॉक्टर। लिंक: http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/dealloc – Rinzwind

3

यदि कोई आवेदन मार रहा है, तो एप्लिकेशन लगभग 100% नियंत्रण को खो देगा और विनाशक को कॉल करने का कोई मौका नहीं है।

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