नहीं है, पहले परिदृश्य सुरक्षित नहीं है और स्मृति रिसाव हो जाएगा अगर vector
एक अपवाद फेंकता है।
दूसरा परिदृश्य संकलित नहीं होगा, क्योंकि std::unique_ptr<T>
को T*
में स्पष्ट रूप से परिवर्तित नहीं किया जा सकता है। यहां तक कि अगर यह हो सकता है, तो यह परिदृश्य पहले की तुलना में तर्कसंगत रूप से खराब है, क्योंकि यह आपके वेक्टर में पॉइंटर जोड़ देगा, फिर ऑब्जेक्ट को तुरंत इंगित कर देगा। आपको एक लटकने वाले सूचक वाले वेक्टर के साथ छोड़ा जाएगा।
अपने std::vector
के प्रकार को बदलने के बिना (जो मुझे लगता है std::vector<MyPointer*>
है) इस कोड अपवाद को सुरक्षित करने के दो तरीके हैं।
का उपयोग सी ++ 11:
auto ptr = std::unique_ptr<MyPointer>(new MyPointer());
vector.emplace_back(ptr.get());
ptr.release();
या अधिक वर्बोज़ सी ++ 03 तरीका:
MyPointer* ptr = new MyPointer();
try
{
vector.push_back(ptr);
}
catch (...)
{
delete ptr;
throw;
}
आप तो सबसे आसान तरीका है अपने std::vector<MyPointer*>
का प्रकार बदलने के लिए सक्षम हैं, तो
std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::unique_ptr<MyPointer>(new MyPointer()));
या सी ++ 14 के साथ: ऊपर डैनियल फ्रे ने सुझाव दिया उन
std::vector<std::unique_ptr<MyPointer>> vector;
vector.emplace_back(std::make_unique<MyPointer>());
मेरा सुझाव है 'std :: एक बार make_unique' कुछ सी ++ 14 समर्थन उपलब्ध अपनी खुद की अगर नहीं है या। – chris