साथ सी ++ 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
, तो अभिव्यक्ति में अच्छी तरह से परिभाषित व्यवहार होगा, और अपवाद नहीं फेंकेंगे।
... टिप्पणी: जब एक सरणी प्रकार है, यह निर्माता अधिभार संकल्प में भाग नहीं होगा जब तक कि अभिव्यक्ति अच्छी तरह से गठित है और या तो है और करने के लिए परिवर्तनीय है , या है
और करने के लिए परिवर्तनीय है । ...T
delete p
T
T
delete[] p
T
U[N]
Y(*)[N]
T*
T
U[]
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
, तो अभिव्यक्ति , अच्छी तरह से बनाई जाएगी, अच्छी तरह से परिभाषित व्यवहार होगा, और अपवाद नहीं फेंकेंगे। जब है , के लिए परिवर्तनीय होगा ; जब है , के लिए परिवर्तनीय होगा ; अन्यथा, के लिए परिवर्तनीय होगा ।T
delete p
T
T
U[N]
Y(*)[N]
T*
T
U[]
Y(*)[]
T*
Y*
T*
std::vector
। आपको संदर्भ का उपयोग करते हुए सरणी को पास करने के लिए सावधान रहना होगा ताकि आप इसकी प्रतियां न बनाएं। डेटा तक पहुंचने के लिए सिंटैक्स, शेयर्ड_प्ट्र की तुलना में क्लीनर है, और इसे आकार देना बहुत आसान है। और आपको सभी एसटीएल अच्छाई मिलती है जो आपको कभी भी चाहिए।