साथ सी ++ 17 , shared_ptrएक गतिशील आवंटित सरणी का प्रबंधन करने के लिए इस्तेमाल किया जा सकता है। shared_ptrइस मामले में टेम्पलेट तर्क होना चाहिए T[N]या T[]। तो आप लिख सकते हैं
shared_ptr<int[]> sp(new int[10]);
N4659 से, [use.smartptr.saring.const]
template<class Y> explicit shared_ptr(Y* p);
आवश्यकता है: Y एक पूर्ण प्रकार होगा। एक सरणी प्रकार, या , जब एक सरणी प्रकार नहीं है delete[] p, तो अभिव्यक्ति में अच्छी तरह से परिभाषित व्यवहार होगा, और अपवाद नहीं फेंकेंगे।
... टिप्पणी: जब एक सरणी प्रकार है, यह निर्माता अधिभार संकल्प में भाग नहीं होगा जब तक कि अभिव्यक्ति अच्छी तरह से गठित है और या तो है और करने के लिए परिवर्तनीय है , या है
और करने के लिए परिवर्तनीय है । ...Tdelete pT
Tdelete[] pTU[N]Y(*)[N]T*TU[]Y(*)[]T*
इसका समर्थन करने के लिए, सदस्य प्रकार element_typeअब के रूप में परिभाषित किया गया है
using element_type = remove_extent_t<T>;
ऐरे तत्वों का उपयोग करके पहुँचा जा सकता है operator[]
element_type& operator[](ptrdiff_t i) const;
आवश्यक है: get() != 0 && i >= 0। अगर Tहै U[N], i < N। ...
टिप्पणी: जब Tकोई सरणी प्रकार नहीं है, तो यह अनिर्दिष्ट है कि क्या यह सदस्य फ़ंक्शन घोषित किया गया है। यदि यह घोषित किया जाता है, तो यह अनिर्दिष्ट है कि इसका वापसी प्रकार क्या है, सिवाय इसके कि फ़ंक्शन की घोषणा (हालांकि जरूरी नहीं कि परिभाषा) अच्छी तरह से बनाई जाएगी।
सी ++ 17 से पहले , 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[]।
ऊपर दिए गए कस्टम डिलेटर को प्रतिस्थापित किया जा सकता है
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[]
लाइब्रेरी फंडामेंटल के लिए C ++ एक्सटेंशन्स द्वारा पेश किए गए परिवर्तन
ऊपर सूचीबद्ध लोगों के लिए एक और प्री-सी ++ 17 विकल्प लाइब्रेरी फंडामेंटल्स टेक्निकल स्पेसिफिकेशन द्वारा प्रदान किया गया था , जो shared_ptrइसे ऑब्जेक्ट्स की एक सरणी का मालिक होने पर मामलों के लिए बॉक्स से बाहर काम करने की अनुमति देने के लिए संवर्धित करता था। shared_ptrइस टीएस के लिए किए गए परिवर्तनों का वर्तमान मसौदा N4082 में पाया जा सकता है । ये परिवर्तन std::experimentalनाम स्थान के माध्यम से सुलभ होंगे , और <experimental/memory>हेडर में शामिल होंगे । shared_ptrसरणियों के समर्थन के लिए कुछ प्रासंगिक परिवर्तन हैं:
- सदस्य प्रकार की परिभाषा element_typeबदल जाती है
typedef T element_type;
typedef typename remove_extent<T>::type element_type;
- सदस्य operator[]जोड़ा जा रहा है
element_type& operator[](ptrdiff_t i) const noexcept;
- विपरीत unique_ptrसरणियों के लिए आंशिक विशेषज्ञता, दोनों shared_ptr<T[]>और shared_ptr<T[N]>मान्य होगा और दोनों में परिणाम होगा delete[]वस्तुओं की कामयाब सरणी पर बुलाया जा रहा है।
template<class Y> explicit shared_ptr(Y* p);
आवश्यकता है : Yएक पूर्ण प्रकार होगा। एक सरणी प्रकार, या , जब एक सरणी प्रकार नहीं है delete[] p, तो अभिव्यक्ति , अच्छी तरह से बनाई जाएगी, अच्छी तरह से परिभाषित व्यवहार होगा, और अपवाद नहीं फेंकेंगे। जब है , के लिए परिवर्तनीय होगा ; जब है , के लिए परिवर्तनीय होगा ; अन्यथा, के लिए परिवर्तनीय होगा ।Tdelete pTTU[N]Y(*)[N]T*TU[]Y(*)[]T*Y*T*
std::vector। आपको संदर्भ का उपयोग करते हुए सरणी को पास करने के लिए सावधान रहना होगा ताकि आप इसकी प्रतियां न बनाएं। डेटा तक पहुंचने के लिए सिंटैक्स, शेयर्ड_प्ट्र की तुलना में क्लीनर है, और इसे आकार देना बहुत आसान है। और आपको सभी एसटीएल अच्छाई मिलती है जो आपको कभी भी चाहिए।