2013-02-15 17 views
7

मैं इस तरह कुछ कोड लिख रहा हूँ:क्या मुझे सी ++ में स्थिर सरणी हटा दी जानी चाहिए?

while(true) { 
    int array[5]; 
    // do something 
} 

लूप के प्रत्येक बारी के लिए, सरणी एक नई सरणी है। क्या मुझे लूप के अंत में सरणी को हटाने की ज़रूरत है?

+4

अंगूठे का नियम: प्रत्येक 'नए' के ​​लिए बिल्कुल एक 'हटाएं'; प्रत्येक 'नए []' के लिए बिल्कुल एक 'हटाएं [] '। –

+0

इस सवाल को लगभग उसी समय में लगभग कई बार पूछा गया है। पिंकी का नियम ... पहले डुप्लिकेट की तलाश करें, खासकर अगर यह एक साधारण सवाल है। – thang

उत्तर

12

क्या मुझे लूप के अंत में सरणी को हटाने की आवश्यकता है?

नहीं, आप क्योंकि array स्वत: भंडारण अवधि है इसे हटाने के लिए की जरूरत नहीं है। लूप के दौरान प्रत्येक से बाहर निकलने पर इसे रिहा कर दिया जाएगा।

आपको जोड़े में delete []/new [], और delete/new पर कॉल करने की आवश्यकता है।

+0

हालांकि आप कर सकते हैं? – dtc

+0

@ डीटीसी नहीं, आप उन वस्तुओं को हटा नहीं सकते जो नए नहीं हैं। – billz

+0

ठीक है, त्वरित उत्तर के लिए धन्यवाद। सिर्फ उत्सुक था: पी। – dtc

1

सं

चर ढेर पर घोषित मैन्युअल पुनः आवंटित की जाती किए जाने की जरूरत नहीं है। आपकी सरणी while लूप के भीतर स्कॉप्ड है। लूप के प्रत्येक पुनरावृत्ति के लिए, सरणी को स्टैक पर आवंटित किया जाता है और फिर स्वचालित रूप से हटा दिया जाता है।

केवल एक सरणी new[] साथ घोषित मैन्युअल delete[]

इसके अलावा के साथ पुनः आवंटित की जाती किया जाना चाहिए, सरणी आप यह घोषणा किसी भी अर्थ में static नहीं है। static कीवर्ड में सी का एक विशिष्ट अर्थ है। आपके द्वारा घोषित सरणी वास्तव में auto (स्वचालित संग्रहण) चर के रूप में संग्रहीत है, जिसका अर्थ यह है कि जब यह दायरे से बाहर हो जाता है तो इसे स्वचालित रूप से हटा दिया जाता है।

0

आप (जब तक आप कुछ जटिल असेंबली का उपयोग नहीं करते) नहीं कर सकते हैं और स्टैक पर आवंटित सरणी या ऑब्जेक्ट को हटाने की आवश्यकता नहीं है।

किसी कारण से आपके द्वारा बनाई गई सरणी नष्ट करने के लिए इसकी आवश्यकता लगती है ,:

int *array = new int[5]; 
//do something 
delete[] array; 

इसके अलावा, मेरी सलाह सरणियों के बजाय std::vector उपयोग करने के लिए है।

+0

आप मानक लाइब्रेरी से कुछ भी क्यों उपयोग करेंगे, यह जानने के बिना कि एप्लिकेशन क्या है? –

0

अन्य उत्तरों ने सही ढंग से समझाया है कि delete अनावश्यक है क्योंकि आपकी सरणी ढेर पर है, लेकिन उन्होंने समझाया नहीं है कि स्टैक क्या है। यहां एक बहुत ही उत्कृष्ट स्पष्टीकरण दिया गया है: What and where are the stack and heap?

जैसा कि यह आपके प्रश्न पर लागू होता है: सी और सी ++ में, जब तक कि आप स्पष्ट रूप से संकलक को स्पष्ट रूप से नहीं बताते, तब तक आपके चर ढेर में रखे जाते हैं, जिसका अर्थ है कि वे केवल दायरे में मौजूद हैं (कि है, ब्लॉक) जिसमें वे घोषित कर रहे हैं। ढेर पर कुछ डालने के लिए संकलक को स्पष्ट रूप से बताने का तरीका या तो malloc (सी रास्ता) या new (सी ++ तरीका) के साथ है। केवल तभी आपको free (सी में) या delete/delete[] (सी ++) पर कॉल करने की आवश्यकता है।

+0

हां, शायद यह है, क्योंकि "हटाएं" का कोई मतलब नहीं होना चाहिए जब स्टैक पर चर पर लागू किया जाए। क्या आप एक बेहतर शब्द का सुझाव दे सकते हैं? –

+0

(जिस कारण से मैंने इसे मूल रूप से कहा था, मूल कारण था क्योंकि मूल प्रश्न था "क्या मुझे ** सरणी को हटाने के लिए ** की आवश्यकता है," यानी, ऐसा करना आवश्यक है, और जवाब नहीं है, यह आवश्यक नहीं है।) –

+0

हां, मेरा मतलब ढेर था। धन्यवाद। हालांकि यह एक पुरानी टिप्पणी के संपादन के मुकाबले एक टिप्पणी के रूप में अधिक उपयोगी होता, क्योंकि मुझे वास्तव में संपादन के लिए अधिसूचना नहीं मिली थी। –

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