2011-07-15 21 views
33

स्मार्ट पॉइंटर्स सरणी कैसे संभालते हैं? उदाहरण के लिए,स्मार्ट पॉइंटर्स और सरणी

void function(void) 
{ 
    std::unique_ptr<int> my_array(new int[5]); 
} 

my_array दायरे से बाहर चला जाता है जब और विलुप्त हो जाता है, पूरे पूर्णांक सरणी फिर से दावा किया जाता है? सरणी का केवल पहला तत्व पुनः दावा किया गया है? या क्या कुछ और चल रहा है (जैसे अपरिभाषित व्यवहार)?

उत्तर

63

यह delete[] फोन करेगा और इसलिए पूरे सरणी पुनः दावा किया जाएगा, लेकिन मैं आप से संकेत मिलता है कि आप द्वारा unique_ptr की एक सरणी प्रपत्र का उपयोग कर रहे हैं की जरूरत का मानना ​​है:

std::unique_ptr<int[]> my_array(new int[5]); 

यह कहा जाता है आंशिक विशेषज्ञता के रूप में की unique_ptr

+19

ट्रिविया: यह वह जगह है जहां इस वाक्यविन्यास का आविष्कार हुआ: http://groups.google.com/group/comp.lang.c++/browse_thread/thread/469fcc136b8f2d42/59c0491245293db7?q=%3Cchar%5B%5D%3E+ समूह: comp.lang.c% 2 बी% 2 बी + लेखक: हिनेंट –

+5

@ हावर्ड हिनंट: ट्रिविया के लिए धन्यवाद, मुझे इसके बारे में पता नहीं था। आप ही वह हैं जिसने इसका आविष्कार किया, 2001 में वापस! यह आपको यहां पर रखने के लिए बहुत अच्छा है :) –

+0

यह एकमात्र तरीका भी है जो किसी भी समझ में आता है, 'typedef int (three_ints) [3] पर विचार करें; टेम्पलेट शून्य कार्य (शून्य) {unique_ptr पी (नया टी); } फ़ंक्शन (); ' –

2

संपादित करें: यह उत्तर गलत था, जैसा कि नीचे दी गई टिप्पणियों द्वारा समझाया गया है। यहां मैंने मूल रूप से कहा है:

मुझे नहीं लगता कि std :: unique_ptr को हटाने के लिए जानता है []। यह प्रभावी रूप से में एक सदस्य के रूप में int * है - जब आप एक int * को हटाते हैं तो यह पर जा रहा है, पूरे सरणी को हटा दें, इसलिए इस मामले में आप ठीक हैं।

सामान्य हटाने के विपरीत हटाए गए [] का एकमात्र उद्देश्य यह है कि यह सरणी में प्रत्येक तत्व के विनाशकों को बुलाता है। आदिम प्रकारों के लिए इससे कोई फर्क नहीं पड़ता।

मैं इसे यहां छोड़ रहा हूं क्योंकि मैंने कुछ सीखा - उम्मीद है कि अन्य भी होंगे।

+1

यदि आप 'नया []' का उपयोग करते हैं, तो आपको 'हटाएं [] 'और' std :: unique_ptr' का उपयोग करना चाहिए ताकि इसे संभालने के लिए पर्याप्त स्मार्ट हो और साथ ही साथ कई अन्य सुधार भी हो जाएं, यही कारण है कि यह जल्द ही 'std :: auto_ptr' को प्रतिस्थापित करेगा। – AJG85

+4

-1: 'हटाएं' हमेशा जरूरी है और केवल 'new' के साथ उपयोग किया जाना चाहिए; इसी प्रकार 'हटाएं []' हमेशा और केवल 'नए [] 'के साथ उपयोग किया जाना चाहिए। सी ++ 2003, सेक्शन 5.3.5 (expr.delete) देखें, पैरा 2. –

+3

@ नाथन: इससे कोई फर्क नहीं पड़ता। यह सिर्फ विनाशक नहीं है। मेमोरी आवंटन दिनचर्या आप मिलान आवंटन विधि के साथ स्मृति को हटाने पर निर्भर करती है। इस प्रकार नया/हटाएं और नया []/हटाएं [] मिलान किए गए जोड़े हैं। –

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