मॉड्यूल पाठ (1/2)
std::unique_ptr और std::shared_ptr
शास्त्रीय C++ में, new और delete ऑपरेटरों का उपयोग करके मैन्युअल मेमोरी प्रबंधन, मेमोरी लीक (संसाधन कभी जारी नहीं किए गए) या लटकते पॉइंटर्स (डीललोकेटेड मेमोरी की ओर इशारा करने वाले पॉइंटर्स) जैसे बग का एक सामान्य स्रोत है।
आधुनिक C++ स्मार्ट पॉइंटर्स पेश करता है, जिसे <memory> हेडर में परिभाषित किया गया है। वे स्वचालित रूप से RAII (संसाधन अधिग्रहण प्रारंभ है) का उपयोग करके ढेर-आवंटित मेमोरी के जीवनचक्र का प्रबंधन करते हैं, जब स्मार्ट पॉइंटर दायरे से बाहर हो जाता है तो संसाधन को हटा देते हैं।
std::unique_ptr
std::unique_ptr किसी संसाधन के अनन्य स्वामित्व की अवधारणा को लागू करता है। इसे कॉपी नहीं किया जा सकता, केवल स्थानांतरित किया जा सकता है (std::move के माध्यम से)।
#include <memory>
// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;
// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2std::shared_ptr
std::shared_ptr साझा स्वामित्व की अवधारणा को लागू करता है। एकाधिक स्मार्ट पॉइंटर्स एक ही संसाधन की ओर इशारा कर सकते हैं। वर्ग आंतरिक रूप से एक संदर्भ गणना बनाए रखता है: मेमोरी केवल तभी मुक्त होती है जब अंतिम सक्रिय shared_ptr नष्ट हो जाता है या रीसेट हो जाता है।
#include <memory>
std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count
std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)खुद कोशिश करना
एक std::unique_ptr<int> नामित ptr घोषित करें, इसे 42 मान रखते हुए std::make_unique के साथ प्रारंभ करें। std::cout का उपयोग करके ptr के असंदर्भित मान को प्रिंट करें।
संकेत दिखाएँ
`std::unique_ptr<int> ptr = std::make_unique<int>(42);` का उपयोग करें और फिर आउटपुट स्ट्रीम पर `*ptr` भेजें।
3 प्रयासों के बाद समाधान उपलब्ध है
std::make_shared का उपयोग करके 100 मान के साथ ptr1 नामक std::shared_ptr<int> को इंस्टेंट करें। ptr2 नाम की एक कॉपी बनाएं और std::cout का उपयोग करके ptr1.use_count() द्वारा लौटाए गए मान को प्रिंट करें।
संकेत दिखाएँ
प्रतिलिपि मानक असाइनमेंट के माध्यम से की जाती है: `ptr2 = ptr1;`। `ptr1.use_count()` को प्रिंट करने पर 2 प्रदर्शित होना चाहिए।
3 प्रयासों के बाद समाधान उपलब्ध है