दिलचस्प पोस्ट
क्या एचटीटीपी क्लाइंट एक साथ उपयोग करने के लिए सुरक्षित है? मटैब में गति-कुशल वर्गीकरण पायथॉन / एमएमपी में मल्टीथ्रेडेड ब्लैज़ यूनिक्स / लिनक्स के जावा आईओ कार्यान्वयन "पूंछ- f" मैं .NET Framework के साथ एसएसएल एसएमटीपी के माध्यम से ईमेल कैसे भेज सकता हूं? टर्मिनल के कैरेक्टर एन्कोडिंग को कैसे प्राप्त करें दिनांक समय पिक्चर: तिथि और समय दोनों को चुनें मैं एक्स अक्ष को matplotlib में कैसे बदल सकता हूं, इसलिए कोई सफेद स्थान नहीं है? जावा में क्रमबद्ध संग्रह एंड्रॉइड: कीपैड को हमेशा कैसे दिखाना है? प्राइफाइड डेटासेट में स्थैतिक और गतिशील कॉलम गुलप का उपयोग करने के लिए concatenate और Uglify फ़ाइलें स्ट्रटोक विभाजन की गलती क्या एचटीएमएल 5 में एक मीनललाइन वैधता विशेषता है? वसंत एओपी विधि विधि के लिए किसी अन्य विधि के भीतर काम नहीं कर रहा है

एक सरणी में shared_ptr: इसका उपयोग करना चाहिए?

साझा किए गए एक छोटे से सवाल

क्या shared_ptr को सरणी में इंगित करने के लिए एक अच्छा अभ्यास है? उदाहरण के लिए,

 shared_ptr<int> sp(new int[10]); 

यदि नहीं, तो क्यों नहीं? एक कारण है कि मैं पहले से ही जानता हूं कि कोई shared_ptr बढ़ाना / घटाना नहीं कर सकता है। इसलिए यह एक सरणी के लिए सामान्य सूचक की तरह इस्तेमाल नहीं किया जा सकता है।

वेब के समाधान से एकत्रित समाधान "एक सरणी में shared_ptr: इसका उपयोग करना चाहिए?"

डिफ़ॉल्ट रूप से, shared_ptr किए गए ऑब्जेक्ट पर shared_ptr delete पर कॉल करेगा, जब कोई और संदर्भ नहीं रहेगा। हालांकि, जब आप new[] का उपयोग कर आवंटित करते हैं, तो आपको संसाधन को मुक्त करने के लिए delete[] , और delete नहीं चाहिए।

सरणी के साथ shared_ptr को सही तरीके से उपयोग करने के लिए, आपको कस्टम डिलीवर प्रदान करना होगा।

 template< typename T > struct array_deleter { void operator ()( T const * p) { delete[] p; } }; 

निम्नानुसार share_ptr बनाएँ:

 std::shared_ptr<int> sp( new int[10], array_deleter<int>() ); 

प्रबंधित ऑब्जेक्ट को नष्ट करते समय अब shared_ptr सही तरीके से कॉल को delete[]


जैसा कि टिप्पणियों में दिखाया गया है, सी ++ 11 के साथ, आप इसके बाद के संस्करण array_deleter बजाय सरणी प्रकारों के लिए std::default_delete आंशिक विशेषज्ञता का उपयोग कर सकते हैं।

 std::shared_ptr<int> sp( new int[10], std::default_delete<int[]>() ); 

आप आनन्द के बजाय लैम्ब्डा अभिव्यक्ति का उपयोग कर सकते हैं

 std::shared_ptr<int> sp( new int[10], []( int *p ) { delete[] p; } ); 

इसके अलावा, जब तक आपको वास्तव में प्रबंधित ऑब्जेक्ट को साझा करने की आवश्यकता नहीं होती है, इस कार्य के लिए एक unique_ptr बेहतर अनुकूल होता है, क्योंकि इसमें सरणी प्रकारों के लिए आंशिक विशेषज्ञता है।

 std::unique_ptr<int[]> up( new int[10] ); // this will correctly call delete[] 


पुस्तकालय मूल सिद्धांतों के लिए सी ++ एक्सटेंशन द्वारा प्रस्तुत परिवर्तन

shared_ptr को लाइब्रेरी फंडामेंटल टेक्निकल स्पेसिफिकेशन (टीएस) द्वारा shared_ptr जा रहा है ताकि यह ऑब्जेक्ट की एक सरणी के मालिकों के लिए बॉक्स से बाहर काम करने के लिए अनुमति देता है; स्पष्ट रूप से एक deleter की आपूर्ति की आवश्यकता नहीं होगी इस टीएस के लिए निर्धारित shared_ptr परिवर्तनों का वर्तमान मसौदा N4082 में पाया जा सकता है। ये परिवर्तन std::experimental नाम स्थान के माध्यम से std::experimental जाएंगे, और <experimental/memory> शीर्ष लेख में शामिल होंगे। Arrays के लिए shared_ptr का समर्थन करने के लिए प्रासंगिक परिवर्तनों में से कुछ हैं:

– सदस्य प्रकार element_type परिवर्तन की परिभाषा

टाइपिंगफ टी तत्व_प्रकार;

  typedef typename remove_extent<T>::type element_type; 

– सदस्य operator[] जोड़ा जा रहा है

  element_type& operator[](ptrdiff_t i) const noexcept; 

– सरणियों के लिए unique_ptr आंशिक विशेषज्ञता के विपरीत, दोनों shared_ptr<T[]> unique_ptr shared_ptr<T[]> और shared_ptr<T[N]> मान्य होंगे और दोनों ही ऑब्जेक्ट के प्रबंधित सरणी पर बुलाए जाने वाले delete[] को delete[] देंगे।

  template<class Y> explicit shared_ptr(Y* p); 

आवश्यक है : Y एक पूर्ण प्रकार होगा। अभिव्यक्ति को delete[] p , जब T एक सरणी प्रकार है, या delete p , जब T एक सरणी प्रकार नहीं है, तो वह अच्छी तरह से तैयार होगा, उसका व्यवहार ठीक तरह से होगा, और अपवाद नहीं फेंकना चाहिए। जब T U[N] , Y(*)[N] T* लिए परिवर्तनीय होगा; जब T U[] , Y(*)[] T* लिए परिवर्तनीय होगा; अन्यथा, Y* T* लिए परिवर्तनीय होगा

एक संभवतः आसान विकल्प जिसे आप उपयोग करने में सक्षम हो सकते हैं shared_ptr<vector<int>>