2013-01-10 18 views
7

तो एक unique_ptr इस तरह आरंभ:std :: unique_ptr :: रीसेट और निर्माता अपवाद

std::unique_ptr<Foo> i; 
i.reset(new Foo()); 

लेकिन कोई अपवाद Foo::Foo() से फेंक दिया जाता है, सवाल यह है: क्या आबंटित स्मृति के साथ क्या होता है? अद्वितीय_ptr इसे लीक होने से कैसे बचाता है? क्या यह new ऑपरेटर के अंदर संभाला गया है?

जब दायरा निकलता है तो विनाशक निश्चित रूप से बुलाया जाएगा। चूंकि reset कॉल new Foo() रिटर्न तक लागू नहीं किया गया है, ऐसा लगता है कि अपवाद स्मृति को मुक्त करके आवंटित स्मृति को मुक्त करके new द्वारा इसे संभाला जाना चाहिए।

क्या ऐसा होता है?

+0

देखें http://stackoverflow.com/questions/4094996/what-happens-to-the-memory-allocated-by-new-if-the-constructor-throws – Jon

उत्तर

10

यदि Foo के निर्माता में कोई अपवाद फेंक दिया गया है, तो अद्वितीय पॉइंटर के reset फ़ंक्शन को पहले स्थान पर कभी भी निष्पादित नहीं किया जाता है। इस प्रकार अद्वितीय सूचक अपने मूल मूल्य को बरकरार रखता है।

new अभिव्यक्ति स्मृति को रिसाव नहीं करती है अगर ऑब्जेक्ट निर्माण अपवाद फेंकता है।

+0

और यदि आपके पास 'make_unique' है, तो कोई भी कर सकता है 'i = make_unique ()' का उपयोग करें। – GManNickG

+0

इसके अलावा 'std :: unique_ptr p = new bla();' – Nick

+0

@Nick: इसके बारे में क्या? या तुमने कोशिश की? –