C ++ 11 में use.smartptr.saring.const / 9:
प्रभाव: एक साझा_प्रोट ऑब्जेक्ट का निर्माण करता है जो ऑब्जेक्ट पी और डीलेटर डी का मालिक है। दूसरे और चौथे निर्माणकर्ता आंतरिक उपयोग के लिए मेमोरी आवंटित करने के लिए एक की एक प्रति का उपयोग करेंगे।
दूसरे और चौथे निर्माणकर्ताओं के पास ये प्रोटोटाइप हैं:
template<class Y, class D, class A> shared_ptr(Y* p, D d, A a);
template<class D, class A> shared_ptr(nullptr_t p, D d, A a);
नवीनतम मसौदा में, हमारे उद्देश्य के लिए उपयोग .smartptr.saring.const / 10 समतुल्य है:
प्रभाव: एक साझा_प्रोट ऑब्जेक्ट का निर्माण करता है जो ऑब्जेक्ट पी और डीलेटर डी का मालिक है। जब T एक सरणी प्रकार नहीं है, तो पहले और दूसरे निर्माणकर्ता p के साथ साझा_फ्रेम_थिस को सक्षम करते हैं। दूसरे और चौथे निर्माणकर्ता आंतरिक उपयोग के लिए मेमोरी आवंटित करने के लिए एक की एक प्रति का उपयोग करेंगे। यदि कोई अपवाद फेंका जाता है, तो d (p) कहा जाता है।
तो आवंटितकर्ता का उपयोग किया जाता है यदि आवंटित मेमोरी में इसे आवंटित करने की आवश्यकता होती है। वर्तमान मानक और प्रासंगिक दोष रिपोर्टों के आधार पर, आवंटन अनिवार्य नहीं है, लेकिन समिति द्वारा माना जाता है।
के इंटरफेस हालांकि shared_ptr
एक कार्यान्वयन जहां कभी नहीं एक नियंत्रण ब्लॉक और सभी की अनुमति देता है shared_ptr
और weak_ptr
एक लिंक्ड सूची में डाल दिया गया है, इसलिए व्यवहार में ऐसी कोई कार्यान्वयन है। इसके अतिरिक्त, शब्दों को संशोधित किया गया है, उदाहरण के लिए, use_count
यह साझा किया गया है।
डीलेटर केवल रचनात्मक रूप से स्थानांतरित करने के लिए आवश्यक है। इस प्रकार, कई प्रतियों में होना संभव नहीं है shared_ptr
।
कोई एक कार्यान्वयन की कल्पना कर सकता है जो एक विशेष रूप से डिज़ाइन किए गए डिलेटर को डालता है shared_ptr
और इसे shared_ptr
हटा देता है जब यह विशेष हटा दिया जाता है। जबकि कार्यान्वयन अनुरूप प्रतीत होता है, यह भी अजीब है, खासकर जब से उपयोग की गणना के लिए एक नियंत्रण ब्लॉक की आवश्यकता हो सकती है (यह संभव है लेकिन यहां तक कि उपयोग की गणना के साथ एक ही काम करने के लिए weirder)।
प्रासंगिक डीआर मैंने पाया: 545 , 575 , 2434 (जो यह स्वीकार करते हैं कि सभी कार्यान्वयन एक नियंत्रण खंड का उपयोग कर रहे हैं और इसका अर्थ यह लगता है कि बहु-सूत्रण कुछ हद तक इसे बाधित करता है), 2802 (जिसकी आवश्यकता है कि दोष केवल रचनात्मक रूप से चलते हैं और इस तरह कार्यान्वयन को रोकता है जहां) डिलेटर को कई के बीच कॉपी किया जाता है shared_ptr
)।