क्या C ++ 11 मानक पुस्तकालय किसी std::shared_ptr
को std::unique_ptr
, या इसके विपरीत से परिवर्तित करने के लिए कोई उपयोगिता प्रदान करता है ? क्या यह सुरक्षित संचालन है?
shared_ptr
।
क्या C ++ 11 मानक पुस्तकालय किसी std::shared_ptr
को std::unique_ptr
, या इसके विपरीत से परिवर्तित करने के लिए कोई उपयोगिता प्रदान करता है ? क्या यह सुरक्षित संचालन है?
shared_ptr
।
जवाबों:
std::unique_ptr
अनन्य स्वामित्व को व्यक्त करने का C ++ 11 तरीका है, लेकिन इसकी सबसे आकर्षक विशेषताओं में से एक यह है कि यह आसानी से और कुशलता से एक में परिवर्तित हो जाता हैstd::shared_ptr
।यह
std::unique_ptr
फैक्ट्री फ़ंक्शन रिटर्न प्रकार के रूप में इतनी अच्छी तरह से अनुकूल होने का एक महत्वपूर्ण हिस्सा है । फ़ैक्ट्री फ़ंक्शंस यह नहीं जान सकते हैं कि कॉल करने वाले ऑब्जेक्ट के लिए अनन्य स्वामित्व वाले शब्दार्थ का उपयोग करना चाहते हैं या नहीं, या साझा स्वामित्व (यानीstd::shared_ptr
) अधिक उपयुक्त होगा। ए वापस करकेstd::unique_ptr
, कारखाने सबसे कुशल स्मार्ट पॉइंटर के साथ कॉलर्स प्रदान करते हैं, लेकिन वे कॉलर्स को इसकी अधिक लचीली सिबलिंग से बदलने में बाधा नहीं डालते हैं।
std::shared_ptr
करने के लिएstd::unique_ptr
अनुमति नहीं है। एक बार जब आप एक संसाधन पर जीवन भर के प्रबंधन को बदल देते हैंstd::shared_ptr
, तो आपके दिमाग में कोई बदलाव नहीं होता है। यहां तक कि अगर संदर्भ संख्या एक है, तो आपstd::unique_ptr
इसे प्रबंधित करने, कहने, करने के लिए संसाधन के स्वामित्व को पुनः प्राप्त नहीं कर सकते ।संदर्भ: प्रभावी आधुनिक सी ++। 42 विशिष्ट C ++ 11 और C ++ 14 के अपने उपयोग को बढ़ाने के लिए। स्कॉट मेयर्स।
संक्षेप में, आप आसानी से और कुशलता से एक में बदल सकते हैं std::unique_ptr
करने के लिए std::shared_ptr
, लेकिन आप परिवर्तित नहीं कर सकते std::shared_ptr
करने के लिए std::unique_ptr
।
उदाहरण के लिए:
std::unique_ptr<std::string> unique = std::make_unique<std::string>("test");
std::shared_ptr<std::string> shared = std::move(unique);
या:
std::shared_ptr<std::string> shared = std::make_unique<std::string>("test");
std::unique_ptr
std::shared_ptr
अनूठे_ptr u_ptr को देखते हुए, share_ptr s_ptr बनाएं:
std::shared_ptr<whatever> s_ptr(u_ptr.release());
दूसरे रास्ते पर जाना अव्यवहारिक है।
std::shared_ptr<whatever> s_ptr(std::move(u_ptr));
std::shared_ptr<whatever> s_ptr{std::move(u_ptr)};
Deleter
के अंदर संग्रहितunique_ptr