2010-04-19 18 views
17

मान लें कि मेरे पास निम्न कोड है:बाहर निकलें() या अपवाद एक अंत-स्कोप विनाशक को बुलाए जाने से रोक देगा?

struct mytype 
{ 
    ~mytype() { /* do something like call Mix_CloseAudio etc */ } 
}; 

int main() 
{ 
    mytype instant; 

    init_stuff(); 

    start(); 

    return 0; 
} 

क्या विनाशक को कॉल करने की गारंटी है भले ही बाहर निकलने() का उपयोग कहीं से बाहर() से किया जाता है?

+2

अपवाद विध्वंसक को कॉल करेंगे, 'निकास() 'नहीं होगा। – falstro

+0

बिल्कुल इस मामले में नहीं, लेकिन मुझे जीसीसी के साथ लिनक्स पर * स्थिर वस्तुओं * के लिए बुलाया गया विनाशक मिला। –

उत्तर

21

यदि आप exit पर कॉल करते हैं, तो विनाशक को नहीं बुलाया जाएगा।

C++ से मानक (§3.6.1/4):

कॉलिंग समारोह

void exit(int); 

<cstdlib> (18,3) में घोषित वर्तमान से बाहर निकले बिना कार्यक्रम समाप्त हो जाता है ब्लॉक और इसलिए स्वत: भंडारण अवधि (12.4) के साथ किसी भी वस्तु को नष्ट किए बिना। यदि स्थाई भंडारण अवधि के साथ किसी ऑब्जेक्ट के विनाश के दौरान किसी प्रोग्राम को समाप्त करने के लिए बाहर निकलने के लिए कहा जाता है, तो कार्यक्रम में व्यवहार को अपरिभाषित किया गया है।

16

हां, बाहर निकलें नाशक बुला() का मतलब है बुलाया नहीं किया जाएगा:

समारोह शून्य से बाहर निकलें (int) कॉलिंग; <cstdlib> में घोषित (18.3) वर्तमान ब्लॉक को छोड़कर प्रोग्राम को समाप्त कर देता है और इसलिए स्वचालित संग्रहण अवधि (12.4) के साथ किसी ऑब्जेक्ट को नष्ट कर देता है। यदि बाहर निकलें के दौरान एक प्रोग्राम को समाप्त करने के लिए कहा जाता है, तो स्थिर संग्रहण अवधि के साथ किसी ऑब्जेक्ट का विनाश, प्रोग्राम अपरिभाषित व्यवहार है।

यदि कोई अपवाद फेंक दिया जाता है, तो दूसरी ओर, विनाशक को बुलाया जाएगा। यह सी ++ में अपवाद सुरक्षा का आधार है।

3

अपवादकर्ता विनाशकों को कॉल करेंगे, जब तक कि कार्यक्रम में कुछ अपवाद प्राप्त करता है। यदि अपवाद पकड़े बिना मुख्य() फ़ंक्शन से बाहर निकलता है, तो मानक को स्टैक को साफ करने के लिए रनटाइम की आवश्यकता नहीं होती है।

अपने main() समारोह में एक

try{ 
    // code 
}catch(...){ //that elipsis should actually appear in your code 
      //it doesn't mean I omitted code here. 
    //code 
} 

का उपयोग की गारंटी देगा कि हर अपवाद पकड़ा है, और सभी विनाशकर्ता कहा जाता है।