shared_ptr
संदर्भ गणना को संग्रहीत करने के लिए अतिरिक्त "काउंटर" ऑब्जेक्ट (उर्फ। "साझा गणना" या "नियंत्रण ब्लॉक") का उपयोग करता है। (BTW: कि "काउंटर" वस्तु भी Deleter संग्रहीत करता है।)
हर shared_ptr
और weak_ptr
वास्तविक pointee के लिए सूचक है, और "काउंटर" वस्तु के लिए एक दूसरी सूचक होता है।
weak_ptr
, "काउंटर" वस्तु भंडार दो अलग-अलग काउंटरों को लागू करने के लिए:
- "उपयोग गिनती"
shared_ptr
उदाहरणों वस्तु की ओर इशारा करते की संख्या है।
- "कमजोर गिनती"
weak_ptr
एक वस्तु की ओर इशारा करते उदाहरणों, प्लस की संख्या अगर "उपयोग गिनती" अभी भी है> 0.
जब "उपयोग गिनती" शून्य पर पहुंच pointee हटा दी जाती है ।
"काउंटर" सहायक वस्तु हटा दी जाती है जब "कमजोर गिनती" शून्य तक पहुंच जाती है (जिसका अर्थ है कि "उपयोग गणना" शून्य भी होनी चाहिए, ऊपर देखें)।
जब आप से shared_ptr
प्राप्त करने का प्रयास करते हैं, तो लाइब्रेरी परमाणु रूप से "उपयोग गणना" की जांच करता है, और यदि यह> 0 इसे बढ़ाता है। यदि यह सफल होता है तो आपको अपना shared_ptr
मिलता है। यदि "उपयोग गणना" पहले ही शून्य थी तो आपको इसके बजाय shared_ptr
उदाहरण खाली मिला।
संपादित: अब, क्यों वे एक कमजोर गिनती के बजाय जोड़ने बस "काउंटर" वस्तु को रिहा दोनों की गिनती शून्य करने के लिए छोड़ जब करते हैं? अच्छा प्रश्न।
विकल्प "काउंटर" ऑब्जेक्ट को हटाना होगा जब "उपयोग गणना" और "कमजोर गिनती" दोनों शून्य हो जाएंगे। यहां पहला कारण है: प्रत्येक प्लेटफ़ॉर्म पर दो (पॉइंटर आकार) काउंटर परमाणु रूप से जांचना संभव नहीं है, और यहां तक कि यह कहां है, यह केवल एक काउंटर की जांच करने से अधिक जटिल है।
एक और कारण यह है कि डिलीटर निष्पादित होने तक वैध रहना चाहिए। चूंकि डिलीटर "काउंटर" ऑब्जेक्ट में संग्रहीत होता है, इसका मतलब है कि "काउंटर" ऑब्जेक्ट वैध होना चाहिए। गौर करें कि क्या हो सकता है यदि कोई shared_ptr
और एक weak_ptr
किसी ऑब्जेक्ट में हो, और वे समवर्ती धागे में एक ही समय में रीसेट हो जाएं। मान लें कि shared_ptr
पहले आता है। यह शून्य पर "उपयोग गणना" को कम करता है, और हटाए जाने वाले को निष्पादित करना शुरू करता है। अब weak_ptr
शून्य पर "कमजोर गिनती" को कम करता है, और "उपयोग गणना" शून्य भी शून्य पाता है। तो यह "काउंटर" ऑब्जेक्ट को हटा देता है, और इसके साथ हटाना। जबकि डिलीटर अभी भी चल रहा है।
बेशक वहाँ अलग अलग तरीकों से आश्वस्त करने के लिए है कि "काउंटर" वस्तु जीवित रहता होगा, लेकिन मुझे लगता है कि एक के बाद "कमजोर गिनती" में वृद्धि एक बहुत ही सुंदर और सहज ज्ञान युक्त समाधान है। "काउंटर" ऑब्जेक्ट के लिए "कमजोर गिनती" संदर्भ गणना बन जाती है।और चूंकि shared_ptr
काउंटर ऑब्जेक्ट को भी संदर्भित करता है, इसलिए उन्हें भी "कमजोर गिनती" बढ़ाना पड़ता है।
शायद एक और अधिक सहज समाधान प्रत्येक shared_ptr
के लिए "कमजोर गिनती" को बढ़ाने के लिए होगा, क्योंकि प्रत्येक एकल shared_ptr
होल्ड "ऑब्जेक्ट" ऑब्जेक्ट का संदर्भ है।
सभी shared_ptr
उदाहरणों के लिए एक जोड़ना सिर्फ एक अनुकूलन है (shared_ptr
उदाहरणों को प्रतिलिपि/असाइन करते समय एक परमाणु वृद्धि/कमी बचाता है)।
यह भी देखें: [साझा पॉइंटर्स कैसे काम करते हैं?] (Http://stackoverflow.com/questions/2802953/how-do-shared-pointers-work) –
यह भी देखें [shared_ptr कार्यान्वयन नोट] (http: // en.cppreference.com/w/cpp/memory/shared_ptr#Implementation_notes) – ks1322