2010-03-11 12 views
70

delete और delete[] सी ++ में ऑपरेटरों के बीच क्या अंतर है?हटाएं बनाम हटाएं [] ऑपरेटर सी ++

+0

आप इस सवाल का मिल सकती है प्रासंगिक http://stackoverflow.com/questions/1913343/how-could-pairing-new-with-delete-possibly-lead-to-memory-leak-only – sharptooth

+4

हटाने के साथ मुद्दों और हटाएं [] एक कारण है कि मुझे स्मार्ट पॉइंटर्स क्यों पसंद हैं, और जब भी मैं कर सकता हूं तो सरणी के बजाय 'वेक्टर <>' का उपयोग करना। –

+0

http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete – sbi

उत्तर

88

delete ऑपरेटर deallocates स्मृति और new के साथ बनाई गई एक वस्तु के लिए नाशक कहता है।

delete [] ऑपरेटर स्मृति को हटा देता है और new [] के साथ बनाई गई वस्तुओं की एक सरणी के लिए विनाशकों को कॉल करता है।

एक सूचक एक सूचक द्वारा new परिणाम अपरिभाषित व्यवहार में लौट आए पर new [] या delete [] द्वारा दिया पर delete का उपयोग करना।

+1

मुझे आश्चर्य है कि एक नए [] सरणी जैसे int या char (कोई कन्स्ट्रक्टर नहीं)/विनाशक) अनिवार्य रूप से अपरिभाषित व्यवहार की ओर जाता है।ऐसा लगता है कि आदिम प्रकार का उपयोग करते समय सरणी का आकार कहीं भी संग्रहीत नहीं होता है। – thomiel

+12

यदि मानक परिभाषित नहीं होता है कि जब यह किया जाता है तो क्या होता है, यह परिभाषा "अपरिभाषित व्यवहार" है, भले ही आपका कंपाइलर निश्चित रूप से ऐसा करता है जो आप करना चाहते हैं। एक और कंपाइलर कुछ पूरी तरह से अलग कर सकता है। –

+0

मैंने यह त्रुटि तब बनाई जब मेरे पास "char ** strArray" जैसे सी स्ट्रिंग्स की सरणी थी। यदि आपके पास एक सरणी है, तो आपको सरणी के माध्यम से पुनरावृत्त करने और प्रत्येक तत्व को हटाने/मुक्त करने की आवश्यकता है, फिर strArray को हटाएं/मुक्त करें। सरणी पर "हटाएं []" का उपयोग करके मैंने काम नहीं किया है (जैसा उपर्युक्त टिप्पणियों और उत्तर से इंगित किया गया है), आईटी कॉलर्स डिब्बेक्टर्स, यह वास्तव में प्रत्येक स्लॉट को मुक्त नहीं करता है। – Katianie

4

ऑपरेटरों delete और delete [], new और new[] के साथ बनाई गई वस्तुओं को नष्ट करने के आबंटित स्मृति संकलक की स्मृति प्रबंधक के लिए उपलब्ध छोड़ दिया करने के लिए लौट क्रमशः उपयोग किया जाता है। new के साथ बनाया

वस्तुओं जरूरी delete साथ नष्ट किया जाना चाहिए, और new[] के साथ बनाया सरणियों delete[] साथ नष्ट कर दिया जाना चाहिए।

75

delete[] ऑपरेटर का उपयोग सरणी को हटाने के लिए किया जाता है। delete ऑपरेटर का उपयोग गैर-सरणी वस्तुओं को हटाने के लिए किया जाता है। यह operator delete[] और operator delete फ़ंक्शन को क्रमशः सरणी या गैर-सरणी ऑब्जेक्ट पर कब्जा करने के लिए सरणी के तत्वों या गैर-सरणी ऑब्जेक्ट के लिए विनाशकों को कॉल करने के बाद (स्मृति) को हटाने के लिए कॉल करता है।

typedef int array_type[1]; 

// create and destroy a int[1] 
array_type *a = new array_type; 
delete [] a; 

// create and destroy an int 
int *b = new int; 
delete b; 

// create and destroy an int[1] 
int *c = new int[1]; 
delete[] c; 

// create and destroy an int[1][2] 
int (*d)[2] = new int[1][2]; 
delete [] d; 

एक new कि एक सरणी बनाता है के लिए (हां, तो या तो new type[] या new एक सरणी प्रकार निर्माण करने के लिए लागू), स्टैंडर्ड सरणी के तत्व में एक operator new[] के लिए लग रहा है:

निम्नलिखित संबंधों से पता चलता वर्ग या वैश्विक दायरे में टाइप करें, और अनुरोध की गई स्मृति की मात्रा गुजरती है। यह एक से अधिक N * sizeof(ElementType) अनुरोध कर सकते हैं अगर यह चाहता है (उदाहरण के लिए तत्वों की संख्या स्टोर करने के लिए, तो यह बाद में जब को हटाने जानता किया है कि कितने नाशक कॉल)। यदि वर्ग operator new[] घोषित करता है जो स्मृति की मात्रा के अतिरिक्त अतिरिक्त size_t स्वीकार करता है, तो दूसरा पैरामीटर आवंटित तत्वों की संख्या प्राप्त करेगा - यह किसी भी उद्देश्य के लिए इसका उपयोग कर सकता है (डीबगिंग, इत्यादि ...)।

new के लिए जो एक गैर-सरणी वस्तु बनाता है, यह तत्व की कक्षा में या वैश्विक दायरे में operator new की तलाश करेगा। यह अनुरोध की गई स्मृति की मात्रा पास करता है (वास्तव में sizeof(T) हमेशा)।

delete[] के लिए, यह सरणी तत्व तत्व प्रकार में दिखता है और उनके विनाशकों को बुलाता है। इस्तेमाल किया operator delete[] समारोह तत्व प्रकार के वर्ग में से एक है, या अगर कोई कोई भी वैश्विक क्षेत्र में तो है।

एक delete के लिए, यदि सूचक पारित कर दिया वास्तविक वस्तु के प्रकार का एक आधार वर्ग है, आधार वर्ग एक आभासी नाशक होना चाहिए (अन्यथा, व्यवहार अपरिभाषित है)। यदि यह एक आधार वर्ग है, तो उस वर्ग के नाशक कहा जाता है, और कहा कि कक्षा में एक operator delete या वैश्विक operator delete नहीं है प्रयोग किया जाता है। अगर एक आधार वर्ग पारित किया गया था, तो वास्तविक ऑब्जेक्ट प्रकार नाशक कहा जाता है, और operator delete उस वर्ग में पाया प्रयोग किया जाता है, या अगर कोई भी नहीं है, एक वैश्विक operator delete कहा जाता है।यदि कक्षा में operator delete का दूसरा पैरामीटर size_t है, तो इसे हटाने के लिए तत्वों की संख्या प्राप्त होगी।

8

इस का मूल उपयोग, आवंटित/सी में डे-आवंटन पैटर्न ++ malloc/मुक्त नया, हटाने/नई []/हटाने []

हम उन्हें तदनुसार उपयोग करने के लिए की जरूरत है। लेकिन मेरे द्वारा हटाए जाने के बीच अंतर के लिए इस विशेष समझ जोड़ सकते हैं और []

1) हटाना मिटा देना चाहते हैं डी-आवंटित स्मृति एकल ऑब्जेक्ट

2) हटाना के लिए आवंटित करने के लिए प्रयोग किया जाता है [] डी-आवंटित करने के लिए स्मृति वस्तुओं की सरणी

वर्ग एबीसी {}

के लिए आवंटित किया जाता है

एबीसी * ptr = नई एबीसी [100]

जब हम कहते हैं कि नए [100] .. संकलक (यहां यह 100 है) कितने वस्तुओं के बारे में जानकारी आवंटित किए जाने की जरूरत है कि प्राप्त कर सकते हैं और कॉल करेंगे वस्तुओं में से प्रत्येक के लिए निर्माता

बनाया है, लेकिन तदनुसार अगर हम बस उपयोग करते हैं, संकलक कितने वस्तुओं कि ptr की ओर इशारा करते है और नाशक के बुला खत्म हो जाएगा और के लिए स्मृति को हटाने को पता नहीं चलेगा ptr हटाना इस मामले के लिए केवल 1 वस्तु (विनाशकों के आविष्कार को छोड़कर और शेष 99 वस्तुओं के विलोपन)। इसलिए एक मेमोरी रिसाव

होगा इसलिए हमें इस मामले में हटाएं [] ptr का उपयोग करने की आवश्यकता है।

+2

यह सही जवाब होना चाहिए। अन्य उत्तरों में से कोई भी अलग अंतर का उल्लेख नहीं करता है: "लेकिन संगत रूप से अगर हम इस मामले के लिए हटाए गए पीटीआर का उपयोग करते हैं, तो संकलक को पता नहीं चलेगा कि पीआरआर कितनी ऑब्जेक्ट्स इंगित कर रहा है और विनाशक को बुलाएगा और केवल 1 ऑब्जेक्ट के लिए मेमोरी को हटा देगा" –

+0

हम सी में एक ही चीज़ कैसे प्राप्त करते हैं? –

-1

delete एक सिंगल पॉइंटर के लिए उपयोग किया जाता है और delete[] को पॉइंटर के माध्यम से सरणी हटाने के लिए उपयोग किया जाता है। This आपको बेहतर समझने में मदद कर सकता है।

0

जब मैंने यह सवाल पूछा, तो मेरा असली सवाल था, "क्या दोनों के बीच कोई अंतर है? क्या रनटाइम को सरणी के आकार के बारे में जानकारी रखना नहीं है, और इसलिए यह नहीं बताएगा कि हम कौन सा क्या मतलब है? " यह प्रश्न "संबंधित प्रश्न" में प्रकट नहीं होता है, इसलिए बस मेरे जैसे लोगों की मदद करने के लिए, यहां इसका उत्तर दिया गया है: "why do we even need the delete[] operator?"

0

अच्छा .. शायद मुझे लगता है कि यह केवल स्पष्ट है। ऑपरेटर हटाएं और ऑपरेटर हटाएं [] को प्रतिष्ठित किया गया है लेकिन हटाएं ऑपरेटर सरणी भी जारी कर सकता है।

test* a = new test[100]; 
delete a; 

और पहले से ही इस कोड की जांच कोई यादगार रिसाव नहीं है।

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