2009-05-13 7 views
9

जब मैंने एक संकेतक के रूप में सरणी नाम का उपयोग करके एक कोड संकलित किया, और मैंने delete का उपयोग करके सरणी नाम हटा दिया, तो मुझे सरणी फ़ॉर्म (मुझे सटीक शब्द याद नहीं है) के बिना सरणी हटाने के बारे में चेतावनी मिली।'हटाएं' का सरणी रूप क्या है?

बुनियादी कोड था:

int data[5]; 
delete data; 

तो, क्या हटाना की सरणी प्रपत्र है?

+3

यह अपरिभाषित व्यवहार का आह्वान करता है क्योंकि सरणी को नए [] के साथ आवंटित नहीं किया गया था। –

उत्तर

33

हटाने की सरणी रूप है:

delete [] data; 

संपादित करें:

int data[5]; 

आप: लेकिन जैसे अन्य लोगों ने बताया है, तो आप नहीं इस तरह परिभाषित डेटा के लिए delete बुला जाना चाहिए केवल new का उपयोग करके स्मृति को आवंटित करते समय इसे कॉल करना चाहिए:

int *data = new int[5]; 
+2

लेकिन उसका int डेटा [5] ऑपरेटर नया() द्वारा आवंटित नहीं किया गया था, इसलिए ऑपरेटर डिलीट() का कोई सही रूप नहीं है जिसे कहा जा सकता है। – RBerteig

+1

दिलचस्प ... जवाब सही है, लेकिन ओह इतना गलत है। उन्हें पहले से ही 17 वोट कैसे मिले? –

+2

पूछे जाने वाले प्रश्न के बजाय वास्तव में पूछे गए प्रश्न का उत्तर देना इतना आसान है। खासकर जब यह शीर्षक में और अंतिम वाक्य के रूप में दोहराया गया। – RBerteig

0

जैसे ही रिचीइंडल ने ऊपर बताया था कि जब आप data द्वारा इंगित एक सरणी के लिए गतिशील रूप से आवंटित स्थान को खाली करना चाहते हैं, तो आपको आरक्षित शब्द delete और आवंटित स्थान की शुरुआत में सूचक के बीच दो ब्रैकेट [] डालना होगा। चूंकि data स्मृति में एक int को स्मृति में और साथ ही साथ सरणी में पहले तत्व को इंगित कर सकता है, यह एकमात्र तरीका है जिससे आप संकलक को यह बताते हैं कि आप स्मृति के पूरे हिस्से को हटाना चाहते हैं। यदि आप इसे सही तरीके से नहीं करते हैं तो व्यवहार "अनिश्चित" है (स्ट्रॉस्ट्रप, सी ++ प्रोग्रामिंग भाषा)।

2

दिखाए गए कोड में या तो स्टैक पर या डेटा सेगमेंट के प्रारंभिक भाग में सरणी है, यानी आप इसे अस्वीकार नहीं करते हैं (जिसे, जैसा कि अन्य लोगों द्वारा उल्लिखित किया गया है, "अपरिभाषित व्यवहार" होगा।) "फ्री स्टोर" पर, आप delete [] data के साथ ऐसा करेंगे।

13

आप या तो चाहते हैं:

int *data = new int[5]; 
... // time passes, stuff happens to data[] 
delete[] data; 

या

int data[5]; 
... // time passes, stuff happens to data[] 
// note no delete of data 

पीढ़ी नियम है: केवल स्मृति कि new से आया delete लागू होते हैं। यदि new का सरणी रूप उपयोग किया गया था, तो आप मिलान करने के लिए delete के सरणी रूप का उपयोग करना चाहिए। यदि प्लेसमेंट new का उपयोग किया गया था, तो आप या तो कभी भी delete पर कॉल नहीं करते हैं, या किसी मिलान प्लेसमेंट delete का उपयोग नहीं करते हैं।

परिवर्तनीय int data[5] एक स्थैतिक आवंटित सरणी है, इसे delete ऑपरेटर के किसी भी रूप में पारित नहीं किया जा सकता है।

3

अन्य के रूप में कहा है, आप हटाने की वेक्टर फार्म का उपयोग करना होगा:,

void some_func(size_t n) 
{ 
    int* data = new int[n]; 

    . . . // do stuff with the array 

    delete [] data; // Explicitly free memory 
} 

इस बात का बहुत सावधान रहें क्योंकि कुछ compilers आपको चेताया नहीं होगा।

इससे भी बेहतर, वेक्टर न्यू/डिलीट का उपयोग करने के लिए बहुत ही कम आवश्यकता है।विचार करें कि क्या आपके कोड std :: वेक्टर का उपयोग करने के लिए परिवर्तित किया जा सकता है:

void some_func(size_t n) 
{ 
    std::vector<int> data(n); 

    . . . // do stuff with the array 

} // memory held by data will be freed here automatically 

और अगर आप एक स्थानीय क्षेत्र में स्मृति के साथ काम कर रहे हैं, STLSoft के auto_buffer, जो एक आंतरिक बफर से आवंटित करेगा उपयोग करने पर विचार (ढेर को आयोजित, उदाहरण के हिस्से के रूप) यदि संभव हो तो, केवल ढेर करने के लिए जा अगर यह नहीं कर सकते हैं:

void some_func(size_t n) 
{ 
    stlsoft::auto_buffer<int, 10> data(n); // only allocates if n > 10 

    . . . // do stuff with the array 

} // memory held by data will be freed here automatically, if any was allocated 

पढ़ें more about auto_buffer

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