2012-11-03 12 views
10

main से पहले कोड निष्पादित करना निश्चित रूप से संभव है, जैसा कि this question में कई उदाहरणों द्वारा देखा गया है।क्या यह मुख्य से पहले कार्यक्रम से बाहर निकलने के लिए अच्छी तरह से परिभाषित व्यवहार है?

हालांकि, अगर उस पूर्व-मुख्य कोड में, प्रोग्राम को std::exit या std::abort के माध्यम से बाहर निकलने के लिए कहा जाता है? चूंकि main को प्रोग्राम की शुरुआत के रूप में परिभाषित किया गया है, शुरुआत से पहले बाहर निकलने से क्या परिणाम हैं?

प्रत्येक अनुभाग में कुछ मुद्रण पर, मैंने निम्नलिखित परिणाम प्राप्त:

स्वरूप:
धारा: output

मुख्य: main
Init (पहले बुलाया मुख्य): init
बाहर निकलें (std::atexit Init अंदर के साथ सेट अप): exiting



नमूना रन:

Init से बाहर निकले बिना कहा जाता है:

init
मुख्य
रिटर्न 0

Init कॉल std :: बाहर निकलें (0):

init
रिटर्न 0

Init एसटीडी कॉल: : निरस्त:

init
दुर्घटनाओं और जीसीसी 4.7 के साथ Windows पर 3 देता है।2
दुर्घटनाओं और
रिटर्न 0 VS11 साथ हमेशा की तरह बॉक्स सामने आ LiveWorkSpace पर

Init हैंडलर सेट करता है और कहता है std :: बाहर निकलें (0):

init

रिटर्न 0

Init हैंडलर सेट करता है और कहता है std :: बीच में बंद करें:

init
हैंडलर

जबकि खोज, मैं इस सवाल को देखा बिना के रूप में ही सौदा: Is there any way a C/C++ program can crash before main()?। हालांकि, यह जवाब नहीं देता कि मैं क्या जानना चाहता हूं: क्या इस व्यवहार में से कोई भी std::exit या std::abortmain से पहले, अच्छी तरह से परिभाषित किया गया है? क्या यह अनिर्धारित व्यवहार है?

+0

यदि आप परीक्षणों के संयोजन के नमूने में रूचि रखते हैं, [यहां एक है] (http://liveworkspace.org/code/ff19b767d545e3c8a76671b1d21add00)। – chris

उत्तर

7

संक्षिप्त उत्तर है: (लगभग) कोई परिणाम नहीं हैं। अगर आप अप्रत्याशित रूप से exit पर कॉल करते हैं, तो कुछ विनाशकों को बुलाया नहीं जा सकता है, लेकिन यह बहुत अधिक है।
आम तौर पर, विनाशकों को बुलाएं सबसे आसान संभव तरीका नहीं है, लेकिन फिर अंत परिणाम एक जैसा होगा।

जब एक प्रक्रिया समाप्त (exit या abort के माध्यम से या बस segfaulting, या किसी अन्य कारण से), हैंडल (कर्नेल वस्तुओं, फ़ाइलें, आदि) बंद हो जाती हैं, और कार्यक्रम की पता अंतरिक्ष के साथ जुड़े स्मृति ऑपरेटिंग द्वारा पुन: दावा है प्रणाली।

वहाँ नहीं यह करने के लिए किसी और ज्यादा या तो, जब आप exit या abort कहते हैं, आप मूल रूप से है कि कार्यक्रम समाप्त अनुरोध कर रहे हैं क्योंकि (इन कार्यों वापस कभी नहीं!) तो क्या तुम सच में उसके बाद होने के लिए कुछ भी उम्मीद नहीं कर सकते है।

ध्यान दें कि Init जैसे फ़ंक्शन को पंजीकृत करने से पहले main गैर-मानक सामान है, लेकिन आप वैश्विक में एक निर्माता होने के समान प्रभाव प्राप्त कर सकते हैं।

+1

buffered लिखने वाले विध्वंसकों के कारण 'निकास' पर लिखा जाने में विफल हो सकता है। –

+2

@JanDvorak: यदि आप सी या सी ++ मानक पुस्तकालय (iostream या stdio) द्वारा buffered के रूप में "buffered" का संदर्भ लें, तो हाँ। लेकिन फिर, यह वही है जो आप पूछते हैं, इसलिए यह आश्चर्य की बात नहीं है। आखिरकार, आप कह रहे हैं "यह सब है, अब जाओ और मुझे मार दो!"। बुफर्ड लिखते हैं कि ऑपरेटिंग सिस्टम द्वारा स्वीकार किया गया है (सफलतापूर्वक) पूरा होना चाहिए, जब तक कि ऑपरेटिंग सिस्टम गंभीर रूप से टूटा न जाए। – Damon

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