वर्तमान सी ++ मानक (सी ++ 14, साथ ही साथ पिछले संस्करणों में सी ++ 11 और सी ++ 03) में, यह निर्दिष्ट नहीं है कि f()
के पहले या बाद में स्मृति आवंटित की गई है, लेकिन किसी भी में मामला स्मृति आवंटित की जाएगी यदि इसे आवंटित किया गया है; [expr.new]:
20 - वस्तु आरंभीकरण के किसी भी भाग से ऊपर एक अपवाद फेंक कर समाप्त हो जाता है वर्णित हैं, भंडारण वस्तु के लिए प्राप्त किया गया है, और एक उपयुक्त आवंटन रद्द समारोह हो सकता है पाया, आवंटन रद्द करने समारोह स्मृति मुक्त करने के लिए बुलाया है [...]
79) यह एक नए प्रारंभकर्ता का मूल्यांकन और/या एक निर्माता बुला शामिल हो सकते हैं।
यहाँ नए प्रारंभकर्ताf()
है, इसलिए यदि f()
के मूल्यांकन के लिए एक अपवाद फेंकता है, आवंटन रद्द करने फ़ंक्शन कॉल किया जाएगा (यदि पाया जाता है)।
सी ++ 17 के बाद से, स्मृति के आवंटन से पहले f()
के मूल्यांकन अनुक्रम है, इसलिए स्मृति हमेशा पुनः आवंटित की जाती किया जाएगा:
21 - वस्तु आरंभीकरण के किसी भी हिस्से ऊपर वर्णित हैं 79 समाप्त एक अपवाद और एक उपयुक्त आवंटन रद्द समारोह फेंक कर, पाया जा सकता है आवंटन रद्द समारोह कहा जाता है [...]
नोट कि हालांकि बाद memor वाई आवंटन भयानक है, कार्यान्वयन आवंटन को छोड़ने के लिए स्वतंत्र रूप से है यदि यह भविष्यवाणी कर सकता है कि एक अपवाद फेंक दिया जाएगा।
कार्यान्वयन को 'टी' ऑब्जेक्ट के लिए आवंटित किसी भी स्मृति को मुक्त करना चाहिए। –