मुझे दो के बीच अंतर पता है। एक उल्लेखनीय बात यह है कि abort() SIGABRT सिग्नल भेजता है, इसलिए यह तब प्रासंगिक हो सकता है जब आपका सॉफ़्टवेयर उन पर निर्भर करता है। लेकिन एक सामान्य अनुप्रयोग निकास() के लिए abort() ... के अधिक सुरक्षित संस्करण प्रतीत होता है? बाहर निकलने के बजाय abort() का उपयोग करने के लिए कोई अन्य चिंताएं हैं?जब निरस्त() को निकास() पर प्राथमिकता दी जाती है?
उत्तर
abort
का उपयोग करते हुए कोर डंप हो जाएगा, यदि उपयोगकर्ता कोर डंप सक्षम किया गया है। तो अंगूठे के नियम के रूप में, मैं abort
का उपयोग करता हूं यदि आप गलत होने के बारे में अनिश्चित हैं कि इसके बारे में उपयोगी जानकारी प्राप्त करने का एकमात्र तरीका कोर डंप का विश्लेषण करना है।
यदि आप किसी दिए गए बिंदु से exit
सुरक्षित रूप से सुरक्षित कर सकते हैं, और कोर डंप की आवश्यकता नहीं है, तो बाहर निकलें एक अच्छा दृष्टिकोण है।
कभी-कभी आपका प्रोग्राम इस हद तक टूट जाता है कि उसका राज्य असंगत हो जाता है और इसलिए exit()
काम नहीं करेगा क्योंकि इससे वैश्विक वस्तुओं का विनाश हो सकता है और बाद में राज्य असंगत होने पर बाद में ठीक से काम नहीं करेगा। ऐसी परिस्थितियों में abort()
को प्राथमिकता दी जानी चाहिए।
मुझे लगता है कि उदाहरण के लिए जब आईओडी असफलता के कारण अप्रत्यक्ष हो जाता है? आप इसे अपवाद के रूप में पकड़ते हैं लेकिन आप फ़ाइल ऑब्जेक्ट्स को नष्ट नहीं कर सकते हैं क्योंकि उनके विनाशकों को फ़ाइल को बंद करने की आवश्यकता होती है। विचार के लिए धन्यवाद। – doc
@ डॉक: हाँ, लेकिन यह एक अपेक्षाकृत चरम उदाहरण है। एक और सी ++ उदाहरण: आप पहले से ही एक त्रुटि को संभालने में हैं और एक और त्रुटि होती है (त्रुटि प्रबंधन प्रक्रिया से संबंधित नहीं) और हैंडलिंग कोड पुन: प्रस्तुत किया जाता है। यह बहुत अच्छा नहीं है - त्रुटियां तेज़ी से होती हैं कि आप उन्हें संभाल सकते हैं। तो आप एक झंडा बनाए रखते हैं "मैं पहले से ही इस प्रकार की त्रुटि को संभालने में हूं"। कोड को फिर से घुमाने के बाद आप तौलिया में फेंक दें - तुरंत प्रोग्राम को समाप्त करने के लिए 'abort()' पर कॉल करें। – sharptooth
यही कारण है कि आप विनाशकों से 'फेंक' नहीं देते हैं। यदि विनाशक को अपवाद के कारण अवांछित स्टैक के दौरान बुलाया जाता है, तो 'abort() 'कहा जाता है। –
उपयोग abort()
अपने कार्यक्रम एक संभवतः भ्रष्ट राज्य में है और आप इसे बहुत खतरनाक आगे कुछ भी करने की कोशिश करने पर विचार करें। exit()
किसी भी atexit
फ़ंक्शंस का कारण बनता है, और स्थिर वस्तुओं के सी ++ विध्वंसकों को बुलाया जाएगा। आमतौर पर यह एक साफ निकास के लिए आप चाहते हैं, लेकिन यह विनाशकारी हो सकता है, उदाहरण के लिए, वे दूषित डेटा के साथ एक फ़ाइल को ओवरराइट करते हैं।
+1: लेकिन आपके पास इसे करने के अन्य तरीके भी हैं। एटएक्सिट के रूप में पंजीकृत फ़ंक्शन को कॉल करने के लिए आप बाहर निकलने के बजाय _exit() भी कर सकते हैं, या तत्काल बाहर निकलने के लिए स्वयं को सिगकिल भी भेज सकते हैं। – kriss
@ क्रिस: 'abort()' ऐसा करने का मानक तरीका है, और आसान है। आप एक गैर-मानक विधि क्यों चुनेंगे? – MSalters
@ क्रिस: '_exit()' मानक सी या सी ++ नहीं है, और 'सिगैबर्ट' के अलावा सिग्नल बढ़ाने से निरस्त करना एक अजीब बात है। –
बीच में बंद करें preffered है जब आवेदन और अपवाद को संभालने में सक्षम परिदृश्य क्या करना है समझने में सक्षम नहीं doesnot। बाहर निकलें() मतलब आवेदन सभी कार्य को पूरा ढंग से पूरा करना होगा। अगर अपवाद होता है और एप्लिकेशन इसे संभालने में सक्षम होता है तो बाहर निकलें() कॉल होता है।
यह भी अच्छी बात है +1 – doc
मैं इसे फिर से बदल दूंगा: क्या आप अपने उपयोगकर्ताओं को कोर डंप का विश्लेषण करने की उम्मीद कर रहे हैं? यदि नहीं, तो निरस्तक का उपयोग न करें। (ध्यान रखें कि यद्यपि डेवलपर कोर डंप चाहता है, लेकिन आपके उपयोगकर्ता शायद नहीं कर सकते हैं। तो शायद अपरिवर्तनीय केवल आपके निष्पादन योग्य के "डीबग" संस्करण में उपयोग किया जाना चाहिए।) –
@ केन साइमन: यदि उपयोगकर्ता कोर नहीं चाहते हैं डंप, वे उन्हें बंद कर सकते हैं (ulimit -c 0)। मुझे लगता है कि उबंटू डिफ़ॉल्ट रूप से ऐसा करता है। – camh