मुख्य सामग्री पर जाएं
मॉड्यूल 7 · पाठ 1 का 2पाठ्यक्रम में 15/18~12 min
मॉड्यूल पाठ (1/2)

std::unique_ptr और std::shared_ptr

शास्त्रीय C++ में, new और delete ऑपरेटरों का उपयोग करके मैन्युअल मेमोरी प्रबंधन, मेमोरी लीक (संसाधन कभी जारी नहीं किए गए) या लटकते पॉइंटर्स (डीललोकेटेड मेमोरी की ओर इशारा करने वाले पॉइंटर्स) जैसे बग का एक सामान्य स्रोत है।

आधुनिक C++ स्मार्ट पॉइंटर्स पेश करता है, जिसे <memory> हेडर में परिभाषित किया गया है। वे स्वचालित रूप से RAII (संसाधन अधिग्रहण प्रारंभ है) का उपयोग करके ढेर-आवंटित मेमोरी के जीवनचक्र का प्रबंधन करते हैं, जब स्मार्ट पॉइंटर दायरे से बाहर हो जाता है तो संसाधन को हटा देते हैं।

std::unique_ptr

std::unique_ptr किसी संसाधन के अनन्य स्वामित्व की अवधारणा को लागू करता है। इसे कॉपी नहीं किया जा सकता, केवल स्थानांतरित किया जा सकता है (std::move के माध्यम से)।

C++
#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 p2

std::shared_ptr

std::shared_ptr साझा स्वामित्व की अवधारणा को लागू करता है। एकाधिक स्मार्ट पॉइंटर्स एक ही संसाधन की ओर इशारा कर सकते हैं। वर्ग आंतरिक रूप से एक संदर्भ गणना बनाए रखता है: मेमोरी केवल तभी मुक्त होती है जब अंतिम सक्रिय shared_ptr नष्ट हो जाता है या रीसेट हो जाता है।

C++
#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)

खुद कोशिश करना

व्यायाम#cpp.m7.l1.e1
प्रयास: 0लोड हो रहा है...

एक std::unique_ptr<int> नामित ptr घोषित करें, इसे 42 मान रखते हुए std::make_unique के साथ प्रारंभ करें। std::cout का उपयोग करके ptr के असंदर्भित मान को प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

`std::unique_ptr<int> ptr = std::make_unique<int>(42);` का उपयोग करें और फिर आउटपुट स्ट्रीम पर `*ptr` भेजें।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम#cpp.m7.l1.e2
प्रयास: 0लोड हो रहा है...

std::make_shared का उपयोग करके 100 मान के साथ ptr1 नामक std::shared_ptr<int> को इंस्टेंट करें। ptr2 नाम की एक कॉपी बनाएं और std::cout का उपयोग करके ptr1.use_count() द्वारा लौटाए गए मान को प्रिंट करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

प्रतिलिपि मानक असाइनमेंट के माध्यम से की जाती है: `ptr2 = ptr1;`। `ptr1.use_count()` को प्रिंट करने पर 2 प्रदर्शित होना चाहिए।

3 प्रयासों के बाद समाधान उपलब्ध है