2010-07-05 7 views
37

निम्नलिखित कोड पर विचार करें:एक ब्लॉक से गोटो बाहर: क्या विनाशकों को बुलाया जाता है?

void foo() 
{ 
    { 
     CSomeClass bar; 

     // Some code here... 

     goto label; 

     // and here... 
    } 

label: 
    // and here... 
} 

क्या बार के विनाशक को बुलाया जाएगा?

+0

आपको यह जानने की आवश्यकता क्यों है? 'गोटो' जेनरेट कोड में समझ में आता है, लेकिन वैसे भी आप विनाशकों के साथ वस्तुओं से बच सकते हैं और उन्हें टालना चाहिए। – MSalters

+13

@MSalters: यह बिल्कुल परेशान नहीं करता है, आप विनाशकों के साथ वस्तुओं से क्यों बचें? –

+1

@ विक्टर: मुझे वाक्य के दूसरे भाग का विस्तार करने दें: _ जेनरेट कोड_ में, आप वैसे भी विनाशकों के साथ वस्तुओं से बच सकते हैं। 'गोटो 'का कैननिकल उपयोग जेएसएम कोड जेनरेट किया गया है। राज्य कोडों के संबंध में यहां कूदता है और आगे, आगे बढ़ता है जो कि बीच में होता है। एफएसएम राज्य बस रैखिक नहीं हैं, लेकिन सी ++ कोड होना चाहिए। – MSalters

उत्तर

52

सी ++ मानक का कहना है:

एक गुंजाइश (हालांकि पूरा), विनाशकर्ता (12.4) कर रहे हैं स्वत: भंडारण अवधि (3.7.2) (नाम के साथ सभी का निर्माण वस्तुओं के लिए कहा जाता है से बाहर निकलने पर

ओ bjects या temporaries) जो उस दायरे में घोषित किए गए हैं, में उनके घोषणा के विपरीत क्रम।

तो उत्तर "हां" है।

+0

धन्यवाद। मुझे यही चाहिए। –

9

1) हां। 2) ऐसा मत करो।

विस्तार: अवधारणात्मक रूप से, यह break के माध्यम से लूप छोड़ने से अलग नहीं है। goto, हालांकि, दृढ़ता से दृढ़ता से निराश है। goto का उपयोग करने के लिए लगभग कभी भी आवश्यक नहीं है, और यह पता लगाने के लिए कि क्या हो रहा है, किसी भी उपयोग की जांच की जानी चाहिए।

+0

बिल्कुल सही जवाब। – Mizipzor

+1

2) जब आप वास्तव में लूप से बचते हैं तो आप ऐसा करते हैं। –

+14

दरअसल, गोटो कुछ परिस्थितियों में समझ में आता है। –

21

हां, उन्हें बुलाया जाएगा।

अद्यतन: (।। यह ऐसा करने के लिए ठीक है, gotos डमी अपवाद फेंकने या bools/आईएफएस का उपयोग कर चीजों से बाहर निकलना से भी बदतर नहीं है एक समारोह के अंदर एक साधारण गोटो यह स्पेगेटी कोड नहीं बनाते हैं)

+7

+1 को गड़बड़ाने के लिए गड़बड़ करने की आवश्यकता महसूस करते हैं, क्योंकि वे व्यक्तिगत रूप से सोचते हैं कि गेटोस बुराई है। आपके प्रोफेसरों ने आपको क्या बताया है, इस पर ध्यान दिए बिना, गोटोस के पास वैध उपयोग हैं। – KevenK

+2

"ऐसा करने के लिए ठीक है, गेटो अपवादों को फेंकने से गुस्सा नहीं है या चीजों से बाहर निकलने के लिए बूल/आईएफएस का उपयोग करना" डमी अपवाद फेंकना ऐसा करने का एक भयानक तरीका है (अपवाद फेंकना आम तौर पर बेहद महंगा है) और यदि यह बीच है वह और गेटोस, मैं निश्चित रूप से गेटोस पसंद करेंगे। हालांकि, इन मामलों के लिए लेखन कार्य निश्चित रूप से जाने का सबसे अच्छा तरीका है। – stinky472

+1

@ केविन - गोटो के सिद्धांत में वैध उपयोग हो सकते हैं, लेकिन वे अभ्यास में बेहद दुर्लभ हैं। मैं तर्क दूंगा कि अगर ऐसा लगता है कि आपको गोटो का उपयोग करना है, तो कम से कम स्थिति की स्थिति निकटतम परीक्षा में है। और देवताओं की शुरुआत के लिए, मैं सुझाव दूंगा कि उन्हें सीखने के लिए एक अच्छा अनुशासन है। – jwismar

4

हां, जैसा कि हर कोई कहता है। सी ++ यह निर्दिष्ट/अनिवार्य है।

लेकिन सिर्फ इतना है कि में जोड़ने के लिए, पूर्णता के लिए: अपने goto computed- goto एक्सटेंशन कुछ compilers में मिली जानकारी का उपयोग करता है, तो - MSVC सहित जीसीसी, बजना, संभवतः दूसरों लेकिन नहीं पिछले मैं जानता था - या नहीं, ऑब्जेक्ट के विनाशक को बुलाया जाएगा बहुत आलसी है। जब goto एक ही स्थान पर जाता है, तो यह बहुत स्पष्ट है कि नियंत्रक को नियंत्रण-प्रवाह हस्तांतरण से पहले क्या कहा जाना चाहिए। लेकिन एक गणना goto के साथ, "अपेक्षित" अर्थशास्त्र देने के लिए विभिन्न विनाशकों को गतिशील रूप से कॉल करने की आवश्यकता हो सकती है। मुझे यकीन नहीं है कि इस एक्सटेंशन को लागू करने वाले कंपाइलर्स, उन मामलों में क्या करते हैं। इसका सामना करने से मेरी याददाश्त यह है कि क्लैंग चेतावनी देता है जब गणना की जाती है- goto किसी ऑब्जेक्ट के साथ एक गैर-परीक्षण विनाशक के साथ एक गुंजाइश छोड़ सकता है, जिसका दावा है कि विनाशक को नहीं बुलाया जाएगा। कुछ मामलों में यह ठीक हो सकता है, दूसरों में नहीं। मैं नहीं जानता कि अन्य कंपाइलर क्या करते हैं। यदि आप गैर-तुच्छ विनाशकों के साथ वस्तुओं के साथ संगीत कार्यक्रम में गणना goto एस का उपयोग करना चाहते हैं तो बस इस मुद्दे से अवगत रहें।

+0

धन्यवाद। मैं केवल सी से गणना की गई गेटोस का उपयोग करता हूं, और बहुत दुर्लभ परिस्थितियों में। –

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