मॉड्यूल पाठ (2/2)
std::weak_ptr
हालाँकि std::shared_ptr अत्यंत उपयोगी है, केवल साझा स्वामित्व पर निर्भर रहने से परिपत्र संदर्भ (या चक्रीय निर्भरता) नामक समस्या हो सकती है।
यदि दो या दो से अधिक वस्तुओं में से प्रत्येक में एक दूसरे की ओर इंगित करने वाला shared_ptr होता है, तो एक बंद लूप बनाया जाता है। इस स्थिति में, किसी भी ऑब्जेक्ट की संदर्भ संख्या कभी भी शून्य तक नहीं पहुंचेगी, जिससे आवंटन रद्द होने से रोका जा सकेगा और मेमोरी लीक हो सकती है।
std::weak_ptr क्या है
स्वामित्व चक्र को तोड़ने के लिए, मानक पुस्तकालय std::weak_ptr प्रदान करता है। यह एक स्मार्ट पॉइंटर है जो shared_ptr द्वारा प्रबंधित किसी ऑब्जेक्ट का अवलोकन करता है, लेकिन संदर्भ संख्या बढ़ाए बिना।
यह सीधे तौर पर संसाधन का मालिक नहीं है, इसलिए यह इसके विनाश को नहीं रोकता है।
#include <memory>
std::shared_ptr<int> shared = std::make_shared<int>(42);
std::weak_ptr<int> weak = shared; // Does not increment reference count!संसाधन का सत्यापन और उस तक पहुंच
क्योंकि weak_ptr के पास संसाधन का स्वामित्व नहीं है, इसलिए संसाधन को किसी भी समय हटाया जा सकता है (जब सभी संबद्ध shared_ptr उदाहरण दायरे से बाहर हो जाते हैं)।
प्रेक्षित संसाधन का उपयोग करने के लिए, हमें यह करना होगा:
expired()का उपयोग करके जांचें कि क्या यह अभी भी वैध है।lock()विधि का उपयोग करके अस्थायी रूप सेweak_ptrकोshared_ptrमें परिवर्तित करें। यदि संसाधन अभी भी सक्रिय है, तोlock()एक वैधshared_ptrलौटाता है, अन्यथा यह एक शून्य सूचक (nullptr) लौटाता है।
if (!weak.expired()) {
// lock() creates a temporary shared_ptr to ensure safe access
if (std::shared_ptr<int> sharedAccess = weak.lock()) {
std::cout << *sharedAccess << std::endl;
}
} else {
std::cout << "Resource deallocated!" << std::endl;
}खुद कोशिश करना
sPtr से प्रारंभ किए गए wPtr नामक std::weak_ptr<int> की घोषणा करें। फिर std::cout का उपयोग करके wPtr.expired() द्वारा लौटाए गए बूलियन परिणाम को प्रिंट करें।
संकेत दिखाएँ
समान सामान्य प्रकार `<int>` को इंगित करने वाले `weak_ptr` को घोषित करें और इसे सीधे `sPtr` असाइन करें।
3 प्रयासों के बाद समाधान उपलब्ध है
अस्थायी साझा_पीटीआर प्राप्त करने के लिए wPtr पर लॉक() विधि का उपयोग करें। यदि ऑपरेशन सफल होता है (पॉइंटर शून्य नहीं है), तो संदर्भित मान प्रिंट करें।
संकेत दिखाएँ
`wPtr.lock()` को कॉल करके `if` ब्लॉक के अंदर एक वेरिएबल को प्रारंभ करें, फिर तारांकन चिह्न `*` के साथ इसे डीरेफ़रिंग करने वाले संसाधन को प्रिंट करें।
3 प्रयासों के बाद समाधान उपलब्ध है