unique_ptr<T>
कच्चे पॉइंटर का निर्माणकर्ता किसी प्रकार की वस्तु को T
स्वीकार करता है (इसलिए, यह स्वीकार करता है T*
)।
पहले उदाहरण में:
unique_ptr<int> uptr (new int(3));
सूचक एक new
अभिव्यक्ति का परिणाम है , जबकि दूसरे उदाहरण में:
unique_ptr<double> uptr2 (pd);
सूचक pd
चर में संग्रहीत किया जाता है।
वैचारिक रूप से, कुछ भी नहीं बदलता है (आप unique_ptr
एक कच्चे सूचक से निर्माण कर रहे हैं ), लेकिन दूसरा दृष्टिकोण संभवतः अधिक खतरनाक है, क्योंकि यह आपको, उदाहरण के लिए, करने की अनुमति देगा:
unique_ptr<double> uptr2 (pd);
unique_ptr<double> uptr3 (pd);
इस प्रकार दो अद्वितीय बिंदु होते हैं जो प्रभावी रूप से एक ही वस्तु को कूटबद्ध करते हैं (इस प्रकार एक अद्वितीय सूचक के शब्दार्थ का उल्लंघन करते हैं )।
यही कारण है कि एक अद्वितीय सूचक बनाने के लिए पहला रूप बेहतर है, जब संभव हो। ध्यान दें, कि C ++ 14 में हम कर पाएंगे:
unique_ptr<int> p = make_unique<int>(42);
जो स्पष्ट और सुरक्षित दोनों है। अब आपकी इस शंका के विषय में:
मेरे लिए भी जो स्पष्ट नहीं है, वह यह है कि पॉइंटर्स, इस तरह से घोषित किए गए "सामान्य" तरीके से घोषित किए गए पॉइंटर्स से अलग होंगे।
स्मार्ट पॉइंटर्स को ऑब्जेक्ट के स्वामित्व के मॉडल के लिए माना जाता है, और स्वचालित रूप से इंगित ऑब्जेक्ट को नष्ट करने का ख्याल रखता है जब उस ऑब्जेक्ट का अंतिम (स्मार्ट, मालिक) सूचक कार्यक्षेत्र से बाहर हो जाता है।
इस तरह आपको delete
गतिशील रूप से आबंटित वस्तुओं पर करने के लिए याद रखने की ज़रूरत नहीं है - स्मार्ट पॉइंटर का विनाशकर्ता आपके लिए ऐसा करेगा - और न ही इस बारे में चिंता करने के लिए कि क्या आप पहले से नष्ट हो चुकी किसी वस्तु के लिए एक (झूलने वाला) सूचक को निष्क्रिय नहीं करेंगे:
{
unique_ptr<int> p = make_unique<int>(42);
}
अब unique_ptr
एक स्मार्ट पॉइंटर है जो अद्वितीय स्वामित्व वाला मॉडल है, जिसका अर्थ है कि आपके कार्यक्रम में किसी भी समय इंगित ऑब्जेक्ट के लिए केवल एक (मालिक) सूचक होगा - यही कारण unique_ptr
है कि गैर-प्रतिलिपि योग्य है।
जब तक आप एक तरह से स्मार्ट पॉइंटर्स का उपयोग करते हैं, जो आपके द्वारा अनुपालन करने के लिए आवश्यक निहित अनुबंध को नहीं तोड़ते हैं, आपके पास यह गारंटी होगी कि कोई मेमोरी लीक नहीं होगी, और आपकी वस्तु के लिए उचित स्वामित्व नीति लागू की जाएगी। रॉ पॉइंटर्स आपको इसकी गारंटी नहीं देते हैं।
new int(3)
नए के लिए एक पॉइंटर लौटाता हैint
, ठीक उसी तरह जैसेpd
नया करने के लिए एक पॉइंटर थाdouble
।