2015-09-22 9 views
7

मैं सोच रहा था क्यों गतिशील सरणियों सीधे std::unique_ptr<> द्वारा समर्थित हैं, लेकिन नहीं std::shared_ptr<> द्वारा:std :: shared_ptr <T[]> के लिए कोई विशेषज्ञता क्यों नहीं है?

unique_ptr<int[]> ptr1(new int[n]); /// OK! 
shared_ptr<int[]> ptr2(new int[n]); /// Incorrect: will not call delete[] 

अद्यतन: मुझे पता चला है कि दूसरी पंक्ति में लिखा जा सकता है:

shared_ptr<int> ptr2(new int[n], default_delete<int[]>()); 

अब मैं मैं सोच रहा हूं कि दृश्य के पीछे क्या चल रहा है std::shared_ptr दूसरे दृष्टिकोण के साथ काम करता है और std::unique_ptr के समान नहीं है?

+0

आपको क्या त्रुटि संदेश मिलता है? –

+0

यह त्रुटि संदेश के बारे में नहीं है, यह दूसरी पंक्ति की शुद्धता के बारे में है क्योंकि यह हटाए जाने का आह्वान नहीं करता है [] – Vahid

+0

क्या आपको 'unique_ptr ' (यानी 'deleter'' के साथ एक डिलीटर निर्दिष्ट नहीं करना है टेम्पलेट पैरामीटर में कोई डिफ़ॉल्ट नहीं है)? कम से कम सुझाव दिया गया है [यहां] (http://en.cppreference.com/w/cpp/memory/unique_ptr) अगर गलत नहीं है। – Walter

उत्तर

3

shared_ptr के साथ आपको के साथ सरणी आवंटित करने पर एक कस्टम डिलीटर का उपयोग करना होगा जो delete[] को आमंत्रित करता है।

इसके अलावा, आपको कच्चे पॉइंटर्स के साथ ऊपर और नीचे कास्टिंग के साथ सावधान रहना होगा, ताकि अपरिभाषित व्यवहार का आह्वान न किया जाए।

unique_ptr में सरणी के लिए सीधा समर्थन है, ताकि जब यह पता चल जाए कि इसमें सरणी के लिए एक पॉइंटर है, तो आप ऊपर या नीचे नहीं जा सकते हैं, और डिफ़ॉल्ट डिलीटर delete[] को आमंत्रित करता है।

+3

का दूसरा भाग देखें, मैं समझता हूं, लेकिन क्या यह share_ptr की सीमा के कारण है कि यह हटाएं [] का उपयोग नहीं कर सकता है? – Vahid

+1

@ वाहिद: ​​'shared_ptr' बूस्ट लाइब्रेरी से आया था, जिसमें ['shared_array'] भी है (http://www.boost.org/doc/libs/1_59_0/libs/smart_ptr/shared_array.htm)। यह तर्कसंगत रूप से 'unique_ptr' की विशेषज्ञता से अधिक स्वच्छ विभाजन है। लेकिन इसका मतलब है कि डिजाइन द्वारा 'shared_ptr', सक्रिय रूप से सरणी का समर्थन नहीं करता है। आपको इसे इसमें शामिल करना होगा, उदा। कस्टम डिलीटर का उपयोग करके। –

+0

तो, कारण बूस्ट lib के साथ संगतता की वजह से है, और क्योंकि 'shared_array' अभी तक एसटीएल वापस पोर्ट नहीं किया गया है, है ना? – Vahid

संबंधित मुद्दे