2010-04-09 10 views
8

सी ++ स्वचालित रूप से ब्लॉक में सभी स्थानीय चर के विनाशकों को विपरीत क्रम में अवरुद्ध करता है, भले ही ब्लॉक सामान्य रूप से बाहर निकलता है (नियंत्रण गिरता है) या अपवाद फेंक दिया जाता है।जब कोई ब्लॉक सामान्य रूप से C++ में बुलाया जाता है तो स्थानीय चर को नष्ट कर रहा है?

ऐसा लगता है कि stack unwinding शब्द केवल बाद वाले पर लागू होता है। स्थानीय प्रक्रिया को नष्ट करने के संबंध में पूर्व प्रक्रिया (ब्लॉक के सामान्य निकास) को कैसे बुलाया जाता है?

+1

यह वास्तव में कुछ भी नहीं कहा जाता है। मानक में हर जगह, यह कहता है कि "... ब्लॉक के अंत में स्वचालित चर नष्ट हो जाते हैं"। यह उस प्रक्रिया को कभी भी नाम नहीं देता है। – GManNickG

+0

@GMan - यूनिकॉर्न्स सहेजें: मुझे लगता है कि आप इसे एक उत्तर के रूप में जोड़ सकते हैं। मानते हैं कि मानक क्या कहता है एक मजबूत तर्क है। – sharptooth

उत्तर

5

"ऑब्जेक्ट से बाहर होने पर" ऑब्जेक्ट स्वचालित रूप से नष्ट हो जाता है। इसे "स्वचालित भंडारण पुनर्विचार" के रूप में संदर्भित किया जा सकता है, लेकिन वास्तव में कचरा संग्रह को संदर्भित करता है (उस वाक्यांश के साथ उस वाक्यांश के साथ कई कागजात हैं जो शब्द का उपयोग कचरा संग्रह के लिए करते हैं)। जब इसका उपयोग खुली/बंद, लॉक/अनलॉक, या उनके उचित रिलीज के साथ संसाधन अधिग्रहण के अन्य रूपों की उचित जोड़ी सुनिश्चित करने के लिए किया जाता है, तो इसे Resource Acquisition is Initialization (RAII) के डिजाइन पैटर्न के रूप में जाना जाता है, जो कुछ हद तक विडंबनापूर्ण है कि आरएआईआई का मुख्य पहलू संसाधन प्रारंभिकरण या अधिग्रहण नहीं है, बल्कि इसके विनाश।

2

जब स्थानीय दायरे से बाहर हो जाता है तो स्थानीय चर नष्ट हो जाता है। शायद इस प्रक्रिया को "गुंजाइश से बाहर जाने" कहा जाता है?

1

मुझे यकीन नहीं है कि इसके लिए एक नाम है। स्टैक वैरिएबल हैं इसलिए स्वचालित है कि कोई भी उनके बारे में चिंता नहीं करता है, कभी भी, इस स्वचालित सफाई प्रक्रिया के लिए नाम देने के लिए पर्याप्त नहीं है।

इसे "दायरे से बाहर जाना" कहते हैं, मुझे लगता है।

1

मैंने हमेशा इसे "गुंजाइश से बाहर जाने" या अधिक सटीक रूप से "auto चर के बाहर जाने वाले" के रूप में बोले हुए सुना है।

1

क्या आप पूछ रहे हैं कि कैसे विधि कॉल वास्तव में मशीन कोड में कार्यान्वित किया जाता है, तो मैं कहूंगा कि यह बुला सम्मेलन पर निर्भर करेगा इस्तेमाल

3

स्टैक इन दोनों मामलों में होता है, यह है कि अभी सामान्य के अंतर्गत है जब निष्पादन विधि वापस आती है (या ब्लॉक निकल जाता है) तो निष्पादन केवल कॉलिंग विधि (या ब्लॉक) के संदर्भ में अवांछित होता है। स्थानीय चर को ढेर पर आवंटित किया जाता है, इसलिए वे आवंटन के विपरीत क्रम में साफ हो जाते हैं, और यह प्रक्रिया है जिसे अनचाहे कहा जाता है। यह किसी अन्य प्रकार के डेटा को प्रोसेस करने से अलग नहीं है जिसे आप लिफो संरचना में स्टोर करेंगे - उदा। पीछे आगे।

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

यह अपवाद हैंडलिंग के मामले में केवल अवांछित शब्द का उपयोग करने के लिए सम्मेलन प्रतीत होता है, लेकिन इन मामलों में से प्रत्येक में यह वही प्रक्रिया होती है। विशिष्ट मामला जहां स्टैक को निकालने के तरीके से बाहर निकलने के कारण अनदेखा किया जाता है उसे वापस लौटने के लिए कहा जाता है, कोड के स्कॉप्ड ब्लॉक से निकलने पर क्या होता है, इसका नामकरण करने के लिए कोई सम्मेलन प्रतीत नहीं होता है।

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

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