पर विचार निम्नलिखित:क्या अद्वितीय_ptrs के कंटेनर के साथ emplace_back का उपयोग करना सुरक्षित है?
std::vector<std::unique_ptr<int>> ptrsToInts;
ptrsToInts.emplace_back(new int);
पुनः आबंटन वेक्टर में होता है और यह काम नहीं करता (std::bad_alloc
फेंक), मैं "सुरक्षित" हूँ या मैं एक int
रिसाव हो जाएगा तो?
सी ++ 11 23.3.6.5 [vector.modifiers]/1 का कहना है:
एक अपवाद प्रतिलिपि निर्माता के अलावा किसी और फेंक दिया जाता है, तो निर्माता, असाइनमेंट ऑपरेटर ले जाते हैं, या
T
की असाइनमेंट ऑपरेटर के लिए कदम या किसी भीInputIterator
ऑपरेशन से कोई प्रभाव नहीं पड़ता है।
जो इंगित करता है कि यह एक संभावित समस्या है। यही है, अगर "कोई प्रभाव नहीं" है, तो unique_ptr
का निर्माण कभी नहीं किया गया था, और इसलिए विनाशक व्यवहार delete
पर भरोसा करेगा कि सूचक नहीं होगा। (जो संकेत दे सकता है कि emplace_back
unique_ptr
एस के कंटेनरों के लिए प्रतिबंधित होना चाहिए)
अच्छा बिंदु। इसने मुझे 'std :: make_unique' के पक्ष में पूरी तरह से 'नए' के उपयोग को छोड़ने के लिए प्रेरित किया है, ताकि मैं जान सकूं कि प्रत्येक आवंटन स्मार्ट पॉइंटर पर जाने के बाद समाप्त हो जाता है। – GManNickG
मैंने इस टिप्पणी को यहां एक टिप्पणी में देखा: http://stackoverflow.com/questions/3283778/why-can-i-not-push-back-a-unique-ptr-into-a-vector/3283795#3283795 –