2016-09-05 5 views
8

के मामले में क्या करना चाहिए मैं जानता हूँ कि एक कार्यान्वयन किसी भी आबंटित स्मृति यदि एक वस्तु के निर्माता इस तरह की स्थिति में एक अपवाद फेंकता मुक्त होना चाहिए कि:क्या एक कार्यान्वयन ऑपरेटर नए और "नेस्टेड" प्रारंभ

new T(); // Suppose that T() throws an exception 

लेकिन निम्नलिखित कोड के बारे में क्या?

new T(f()); // Suppose that T() does NOT throw any exception, but f() does 

इस मामले में कार्यान्वयन क्या करना चाहिए? क्या इसे किसी भी आवंटित स्मृति को मुक्त करना चाहिए?

+0

कार्यान्वयन को 'टी' ऑब्जेक्ट के लिए आवंटित किसी भी स्मृति को मुक्त करना चाहिए। –

उत्तर

4

वर्तमान सी ++ मानक (सी ++ 14, साथ ही साथ पिछले संस्करणों में सी ++ 11 और सी ++ 03) में, यह निर्दिष्ट नहीं है कि f() के पहले या बाद में स्मृति आवंटित की गई है, लेकिन किसी भी में मामला स्मृति आवंटित की जाएगी यदि इसे आवंटित किया गया है; [expr.new]:

20 - वस्तु आरंभीकरण के किसी भी भाग से ऊपर एक अपवाद फेंक कर समाप्त हो जाता है वर्णित हैं, भंडारण वस्तु के लिए प्राप्त किया गया है, और एक उपयुक्त आवंटन रद्द समारोह हो सकता है पाया, आवंटन रद्द करने समारोह स्मृति मुक्त करने के लिए बुलाया है [...]

79) यह एक नए प्रारंभकर्ता का मूल्यांकन और/या एक निर्माता बुला शामिल हो सकते हैं।

यहाँ नए प्रारंभकर्ताf() है, इसलिए यदि f() के मूल्यांकन के लिए एक अपवाद फेंकता है, आवंटन रद्द करने फ़ंक्शन कॉल किया जाएगा (यदि पाया जाता है)।

सी ++ 17 के बाद से, स्मृति के आवंटन से पहले f() के मूल्यांकन अनुक्रम है, इसलिए स्मृति हमेशा पुनः आवंटित की जाती किया जाएगा:

21 - वस्तु आरंभीकरण के किसी भी हिस्से ऊपर वर्णित हैं 79 समाप्त एक अपवाद और एक उपयुक्त आवंटन रद्द समारोह फेंक कर, पाया जा सकता है आवंटन रद्द समारोह कहा जाता है [...]

नोट कि हालांकि बाद memor वाई आवंटन भयानक है, कार्यान्वयन आवंटन को छोड़ने के लिए स्वतंत्र रूप से है यदि यह भविष्यवाणी कर सकता है कि एक अपवाद फेंक दिया जाएगा।

+0

बहुत बहुत धन्यवाद। और सी ++ 98/सी ++ 03 और सी ++ 11 के बारे में क्या? – FrozenHeart

+1

@ फ्रोजनहेर्ट सी ++ 11 और सी ++ 03 सी ++ 14 के समान हैं। – ecatmur

+0

आह, धन्यवाद। "यह निर्दिष्ट नहीं है कि एफ() के पहले या बाद में स्मृति आवंटित की जाती है" - मुझे लगता है कि यह 'टी' के निर्माता पर भी लागू होता है? – FrozenHeart

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