2013-02-23 65 views
5

नष्ट कर सकता हूं सरल -1 डी सरणी में:मैं कैसे ग में यह 2 डी सरणी ++

node *nodes = new node[MAX_NODES]; 

हटाया जा रहा द्वारा:

delete [] nodes; 

सभी नोड्स सरणी में आवंटित हटाता है।

लेकिन इस मामले में:

float (*buildingArray)[3] = new float[10][3]; 

इस बयान buildingArray 3 नाव संकेत की एक भी आयाम सरणी बनाने करता है? और यह आवंटन रद्द लाइन है:

delete[] buildingArray; 

करता है ऊपर आवंटन रद्द करने delete सरणी, लेकिन मैं के बारे में है कि क्या यह अपने संदर्भ को नष्ट करेगा संदिग्ध हूँ?

+0

इसके बजाय वैक्टर का उपयोग करें - http://www.cplusplus.com/reference/vector/vector - बहुत अधिक सरल। –

+5

कभी-कभी एक मौजूदा कोड बेस हमें 2-आयामी सरणी का उपयोग करने के लिए मजबूर करता है। अगर मैं टिप्पणियों को कम कर सकता हूं .... – codetaku

उत्तर

15

क्या उपर्युक्त डी-आवंटन सरणी को हटा देता है?

हां यह करता है।

आप delete या delete [] रूप में कई बार आप new या new [] क्रमशः बुलाया कॉल करने की आवश्यकता:

सीधे शब्दों में नियम का पालन।


आप संकेत दिए गए, जहां प्रत्येक सूचकांक गतिशील स्मृति आवंटित किया गया था की एक सरणी था, तो आप स्पष्ट रूप से इसे लूप करने के लिए की जरूरत है और स्पष्ट रूप से प्रत्येक सरणी तत्व पुनःआवंटन होगा।


एक तरफ ध्यान दें कि आप एक std::vector या std::array बजाय गतिशील आवंटित सरणी का उपयोग कर बंद काफी बेहतर हैं।

+0

ठीक है तो यहां प्रत्येक तत्व में गतिशील स्मृति नहीं है, केवल 1 आयाम (पंक्तियों) में गतिशील स्मृति है और 3 कॉलम में स्थिर स्मृति है, इसलिए उन्हें हटाने की आवश्यकता नहीं है। क्या मैं सही हू ? – Anubha

+0

@ अन्हाभा: कथन 'फ्लोट (* बिल्डिंगएरे) [3] = नई फ्लोट [10] [3];' 3 फ्लोट्स के 10 सरणी की सरणी को संग्रहीत करने के लिए पर्याप्त गतिशील स्मृति आवंटित करता है। पूरा भंडारण फ्रीस्टोर (उर्फ ढेर) पर है। लेकिन चूंकि इसे 'नई []' पर एक कॉल का उपयोग करके आवंटित किया गया था, इसलिए इसे हटाएं [] 'इसे पूरी तरह से हटा दें। –

+0

ठीक है, इसलिए इस प्रश्न में http://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using- नया, सरणी initailisation 2 नए कथन का उपयोग कर रहा था, थर्मर सरल हटाएं [] आर्य; उस मामले में काम नहीं किया होता? – Anubha

2

के 10 सरणी की सरणी आवंटित करता है और पहले तत्व (जो 3 फ्लोट्स की सरणी है) में एक सूचक देता है।

इस सूचक पर delete[] पर कॉल करने से पूरे सरणी को हटा दिया जा सकता है।

दो मामलों के बीच एकमात्र अंतर यह है कि पहले मामले में, गतिशील आवंटित सरणी में संग्रहीत मानों का प्रकार float है और दूसरे मामले में प्रकार float[3] है।

3

हां यह करता है। स्पष्टीकरण इसलिए है क्योंकि स्मृति में कोई जानकारी नहीं है कि आपके सरणी में कितने आयाम हैं।

यदि आपके पास 3 * 4 आइटम सरणी है, तो यह बिल्कुल 12 आइटम सरणी के समान है। यह वही तरीका है जिसे आप विशिष्ट तत्वों को संबोधित करते हैं (जो लाइन फ़ैशन के बाद लाइन में संग्रहीत होते हैं) जो बदलते हैं।

तो delete[] पूरी तरह से काम करेगा।

लेकिन new और delete ऑपरेटरों का उपयोग smart pointers के साथ इन दिनों इतना आम नहीं है, जब तक कि आपके पास वास्तव में आवंटन को नियंत्रित करने का कोई अच्छा कारण न हो।