2010-09-12 3 views
9

delete[] क्यों है? मेरी समझ से यह सरणी के लिए अलग तरीके से व्यवहार करने के लिए। हालांकि, यह वास्तव में क्यों मौजूद है? सी में केवल मुफ्त है और कोई फ्री_एरे नहीं है। सिंटैक्स में delete var और delete []var के बीच केवल अंतर [] है जिसमें कोई पैराम नहीं है (मैं सरणी की लंबाई नहीं बता रहा हूं)।सी ++ में एक डिलीट [] क्यों है?

तो delete[] वास्तव में क्यों मौजूद है? मुझे पता है कि कोई कहेंगे कि आप delete और delete[] (कम से कम मुझे लगता है कि यह संभव है) अधिभारित कर सकते हैं लेकिन कहें कि हम इसे अधिभारित नहीं कर रहे हैं। यह क्यों अस्तित्व में है?

+1

obviuos हटाने के कारण [] होने के कारण यह सरणी तत्वों के लिए विनाशकों को कॉल करेगा। Http://stackoverflow.com/questions/659270/why-is-there-a-special-new-and-delete-for-arrays –

+0

शायद एक और दिलचस्प सवाल यह होगा कि 'हटाएं [] '(और' नया [] ') मौजूद है जब आपके पास' std :: vector' है। – jamesdlin

+2

@jamesdlin: क्योंकि हमारे पास हमेशा 'std :: vector' नहीं था? और क्योंकि 'std :: vector' उनके बिना काम नहीं करेगा? –

उत्तर

19

आम तौर पर, गैर-पीओडी कक्षाओं के लिए, delete[] अभिव्यक्ति को कक्षा उदाहरणों की एक चर संख्या पर विनाशकों को कॉल करना होगा जिन्हें संकलित समय पर निर्धारित नहीं किया जा सकता है। कंपाइलर को आम तौर पर कुछ रन टाइम "जादू" को लागू करना होता है जिसका उपयोग नष्ट करने के लिए वस्तुओं की सही संख्या निर्धारित करने के लिए किया जा सकता है।

delete अभिव्यक्ति को इसके बारे में चिंता करने की ज़रूरत नहीं है, इसे केवल उस ऑब्जेक्ट को नष्ट करना है जो आपूर्ति सूचक इंगित कर रहा है। इस वजह से, यह एक अधिक कुशल कार्यान्वयन हो सकता है।

delete और delete[], delete अप बंटवारे से भूमि के ऊपर सही ढंग से और साथ ही delete[] लागू करने की जरूरत के बिना लागू किया जा सकता।

+0

+1: हमेशा के रूप में, सी ++ में, आप जिस चीज की आवश्यकता नहीं है उसके लिए भुगतान नहीं करते हैं ... –

+0

क्या ?? क्या कोई व्यक्ति उदाहरण दे सकता है कि संक्रामकों की संख्या संकलन समय पर निर्धारित नहीं की जा सकती है? – lvella

+0

@ इवेला: इस समारोह में कैसे: 'शून्य freearray (प्रकार * एक्स) {हटाएं [] एक्स; } ' –

3

यदि आप एक सरणी हटाते हैं, तो केवल पहले ऑब्जेक्ट के विनाशक को बुलाया जाएगा। हटाएं [] सरणी में सभी ऑब्जेक्ट्स के विनाशकों को कॉल करता है और सरणी की स्मृति को मुक्त करता है।

+0

+1: मुझे यह करने के लिए मारो :-) –

+7

यदि आप 'delete' कुछ है कि' के नए xxx [N] परिणाम था ', आप _undefined behaviour_ मिलता है। केवल पहली वस्तु पर विनाशक को बुलाकर केवल एक संभावित परिणाम है। –

3

मान लीजिए [] मौजूद नहीं था, सरणी को हटाने के लिए कोड को केवल सरणी में पहला तत्व हटाने के लिए कोड लिखना।

delete array;  // Deletes first element, oops  
delete &array;  // Deletes first element, oops 
delete &array[0]; // Deletes first element 

एक सरणी सरणी के पहले तत्व के लिए सूचक के लिए एक उपनाम जा रहा है के लिए एक सूचक निश्चित रूप से एक पुरानी सी "सुविधा" है।

+0

_ @ Hans_ संकलन नहीं, तो इस शायद कुछ हद तक एक अंडाकार जवाब है ... लेकिन एक प्रदर्शन के रूप में महान क्यों 'हटाएं [] 'की आवश्यकता है। +1 – stakx

+1

@stakx: यह 'प्रदर्शित नहीं करता है [] हटाने के' है * जरूरत *, जैसे - कार्यान्वयन किसी भी तरह को फ़्लैग सकता आवंटन एक सरणी है या नहीं, बस के रूप में यह वर्तमान में साथ किए गए सभी आवंटन की लंबाई पटरियों 'नई []'। फिर 'हटाएं' ध्वज की जांच कर सकता है और बस सही काम कर सकता है। सरणी के पहले तत्व को हटाने से हमेशा गलत होता है, इसलिए इसे करने के लिए वाक्यविन्यास की आवश्यकता नहीं होती है। –

+0

एआरएम, नहीं, वेक्टर :: ऑपरेटर [] को लागू करने में कठोर अगर उसके लिए कोई वाक्यविन्यास नहीं था। –

1

पर विचार करें:

int* a = new int[25]; 
int* b = a; 

delete b; // only deletes the first element 

C++ कम्पाइलर एक सरणी या एक ही तत्व के लिए ख अंक है कि क्या पता नहीं है। किसी सरणी पर delete पर कॉल करने से पहले तत्व को ही हटा दिया जाएगा।

+1

निष्पक्ष होने के लिए, आप इसे हटाने के लिए भी कह सकते हैं [ ] बी'; यह कैसे पता चलता है कि सरणी में 25 आइटम हैं? जवाब मेटा-सूचना के पीछे है। सिद्धांत रूप में, संकलक इस मेटा-सूचना में एक बूलियन सरणी/गैर-सरणी ध्वज भी संग्रहीत कर सकता है। मुझे लगता है कि चार्ल्स का जवाब असली कारण है। –

+0

[] संकलक को बताता है कि मेटा जानकारी है। –

+2

यहां तक ​​कि सादा 'हटाएं' को मेटा-सूचना की आवश्यकता होती है ताकि मेमोरी को ढेर में वापस छोड़ सकें, उदाहरण के लिए पिछले और अगले आवंटित ब्लॉक या कुछ समान (भारी कार्यान्वयन निर्भर) के पॉइंटर्स। – fredoverflow