2011-08-14 15 views
16

संभव डुप्लिकेट:
Will exit() or an exception prevent an end-of-scope destructor from being called?क्या बाहर निकलने पर कॉल करने वाले विनाशक()?

सी ++ में, जब आवेदन बाहर निकलें (3) ढेर चाहिए पर विनाशकर्ता स्टैक करने के लिए चलाने के लिए कर रहे हैं कॉल?

+0

और, क्या कोई वैकल्पिक दृष्टिकोण है? 'निकास 'को कॉल करने के बजाय एक विशेष प्रकार' फेंक ', इसे' मुख्य 'में पकड़ें, और फिर' मुख्य 'से' बाहर निकलने 'के बजाय' मुख्य 'से' वापसी 'करें? –

+1

@AaronMcDaid मुझे आपका प्रश्न नहीं समझ रहा है। वैकल्पिक दृष्टिकोण क्या है? 'बाहर निकलें()' पर कॉल से बचकर आप क्या करने की कोशिश करेंगे? मेरे ऐप्स में से एक में, मैं एक 'customExit' ऑब्जेक्ट फेंकता हूं और इसे मुख्य रूप से पकड़ता हूं और मुख्य रूप से रिटर्न वैल्यू की आपूर्ति के लिए 'customExit' ऑब्जेक्ट से एक पूर्णांक मान का उपयोग करता हूं, इस प्रकार मेरे आरएआईआई विनाशक चीजों को साफ करने के लिए चलाए जाते हैं अस्थायी फ़ाइलें। – WilliamKF

+0

आपकी टिप्पणी ने मेरे (बुरी तरह से लिखित) प्रश्न का उत्तर दिया। धन्यवाद! असल में, मैं पुष्टि चाहता था कि अन्य लोग इस 'थ्रो' दृष्टिकोण का उपयोग करें ताकि यह सुनिश्चित किया जा सके कि सामान्य कार्यक्रम में सबकुछ नष्ट हो गया है –

उत्तर

28

नहीं, अधिकांश विनाशक exit() पर नहीं चल रहे हैं।

सी ++ 98 §18.3/8 इस पर चर्चा करता है।

अनिवार्य रूप से, जब exit को स्थिर वस्तुओं को नष्ट कर दिया जाता है, atexit हैंडलर निष्पादित होते हैं, खुली सी धाराएं फ़्लश और बंद होती हैं, और tmpfile द्वारा बनाई गई फ़ाइलों को हटा दिया जाता है। स्थानीय स्वचालित वस्तुओं को नष्ट नहीं किया जाता है। यानी, कोई ढेर अनचाहे नहीं है।

कॉलिंग abort कॉल करने से भी कम हो जाता है: कोई भी सफाई नहीं।

+0

उन लोगों के लिए जो कोई सफाई नहीं करना चाहते हैं, _exit() abort() से बेहतर कॉल हो सकता है, क्योंकि गर्भपात SIGABRT सिग्नल को बढ़ाएगा, आमतौर पर एक क्रैश के समान व्यवहार होता है। –

5

यदि आपका ओएस उचित (यूनिक्स, लिनक्स, या हालिया विंडोज) है, तो बाहर निकलने के लिए कॉल करने से कर्नेल को सभी प्रक्रियाओं की स्मृति को आवंटित करने के लिए कहा जाता है। ढेर को अवांछित होने की आवश्यकता नहीं है; यह बस अस्तित्व में रहेगा।

+13

और स्टैक विनाशकों में किसी भी RAII कोड को नहीं बुलाया जाएगा। इससे कोई फर्क नहीं पड़ता कि यह केवल प्रक्रिया के लिए निजी स्मृति के साथ सौदा करता है; लेकिन यह महत्वपूर्ण है अगर यह (ए) फ़ाइलों को हटाया जाता है जिन्हें हटाया जाना चाहिए या नाम बदलना है, या अन्यथा साफ किया जाना चाहिए, और (बी) साझा स्मृति में प्रक्रियाओं के बीच साझा डेटा संरचनाओं की अखंडता। // इन कारणों के कारण, कुछ परियोजनाओं ने बाहर निकलने के उपयोग को मना कर दिया है, और/या एक अपवाद फेंकने के लिए निकास() को फिर से परिभाषित किया है जिससे स्टैक अनचाहे हो जाएगा। –

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