delete
और delete[]
सी ++ में ऑपरेटरों के बीच क्या अंतर है?हटाएं बनाम हटाएं [] ऑपरेटर सी ++
उत्तर
delete
ऑपरेटर deallocates स्मृति और new
के साथ बनाई गई एक वस्तु के लिए नाशक कहता है।
delete []
ऑपरेटर स्मृति को हटा देता है और new []
के साथ बनाई गई वस्तुओं की एक सरणी के लिए विनाशकों को कॉल करता है।
एक सूचक एक सूचक द्वारा new
परिणाम अपरिभाषित व्यवहार में लौट आए पर new []
या delete []
द्वारा दिया पर delete
का उपयोग करना।
मुझे आश्चर्य है कि एक नए [] सरणी जैसे int या char (कोई कन्स्ट्रक्टर नहीं)/विनाशक) अनिवार्य रूप से अपरिभाषित व्यवहार की ओर जाता है।ऐसा लगता है कि आदिम प्रकार का उपयोग करते समय सरणी का आकार कहीं भी संग्रहीत नहीं होता है। – thomiel
यदि मानक परिभाषित नहीं होता है कि जब यह किया जाता है तो क्या होता है, यह परिभाषा "अपरिभाषित व्यवहार" है, भले ही आपका कंपाइलर निश्चित रूप से ऐसा करता है जो आप करना चाहते हैं। एक और कंपाइलर कुछ पूरी तरह से अलग कर सकता है। –
मैंने यह त्रुटि तब बनाई जब मेरे पास "char ** strArray" जैसे सी स्ट्रिंग्स की सरणी थी। यदि आपके पास एक सरणी है, तो आपको सरणी के माध्यम से पुनरावृत्त करने और प्रत्येक तत्व को हटाने/मुक्त करने की आवश्यकता है, फिर strArray को हटाएं/मुक्त करें। सरणी पर "हटाएं []" का उपयोग करके मैंने काम नहीं किया है (जैसा उपर्युक्त टिप्पणियों और उत्तर से इंगित किया गया है), आईटी कॉलर्स डिब्बेक्टर्स, यह वास्तव में प्रत्येक स्लॉट को मुक्त नहीं करता है। – Katianie
ऑपरेटरों delete
और delete []
, new
और new[]
के साथ बनाई गई वस्तुओं को नष्ट करने के आबंटित स्मृति संकलक की स्मृति प्रबंधक के लिए उपलब्ध छोड़ दिया करने के लिए लौट क्रमशः उपयोग किया जाता है। new
के साथ बनाया
वस्तुओं जरूरी delete
साथ नष्ट किया जाना चाहिए, और new[]
के साथ बनाया सरणियों delete[]
साथ नष्ट कर दिया जाना चाहिए।
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
है, तो इसे हटाने के लिए तत्वों की संख्या प्राप्त होगी।
इस का मूल उपयोग, आवंटित/सी में डे-आवंटन पैटर्न ++ malloc/मुक्त नया, हटाने/नई []/हटाने []
हम उन्हें तदनुसार उपयोग करने के लिए की जरूरत है। लेकिन मेरे द्वारा हटाए जाने के बीच अंतर के लिए इस विशेष समझ जोड़ सकते हैं और []
1) हटाना मिटा देना चाहते हैं डी-आवंटित स्मृति एकल ऑब्जेक्ट
2) हटाना के लिए आवंटित करने के लिए प्रयोग किया जाता है [] डी-आवंटित करने के लिए स्मृति वस्तुओं की सरणी
वर्ग एबीसी {}
के लिए आवंटित किया जाता हैएबीसी * ptr = नई एबीसी [100]
जब हम कहते हैं कि नए [100] .. संकलक (यहां यह 100 है) कितने वस्तुओं के बारे में जानकारी आवंटित किए जाने की जरूरत है कि प्राप्त कर सकते हैं और कॉल करेंगे वस्तुओं में से प्रत्येक के लिए निर्माता
बनाया है, लेकिन तदनुसार अगर हम बस उपयोग करते हैं, संकलक कितने वस्तुओं कि ptr की ओर इशारा करते है और नाशक के बुला खत्म हो जाएगा और के लिए स्मृति को हटाने को पता नहीं चलेगा ptr हटाना इस मामले के लिए केवल 1 वस्तु (विनाशकों के आविष्कार को छोड़कर और शेष 99 वस्तुओं के विलोपन)। इसलिए एक मेमोरी रिसाव
होगा इसलिए हमें इस मामले में हटाएं [] ptr का उपयोग करने की आवश्यकता है।
यह सही जवाब होना चाहिए। अन्य उत्तरों में से कोई भी अलग अंतर का उल्लेख नहीं करता है: "लेकिन संगत रूप से अगर हम इस मामले के लिए हटाए गए पीटीआर का उपयोग करते हैं, तो संकलक को पता नहीं चलेगा कि पीआरआर कितनी ऑब्जेक्ट्स इंगित कर रहा है और विनाशक को बुलाएगा और केवल 1 ऑब्जेक्ट के लिए मेमोरी को हटा देगा" –
हम सी में एक ही चीज़ कैसे प्राप्त करते हैं? –
delete
एक सिंगल पॉइंटर के लिए उपयोग किया जाता है और delete[]
को पॉइंटर के माध्यम से सरणी हटाने के लिए उपयोग किया जाता है। This आपको बेहतर समझने में मदद कर सकता है।
जब मैंने यह सवाल पूछा, तो मेरा असली सवाल था, "क्या दोनों के बीच कोई अंतर है? क्या रनटाइम को सरणी के आकार के बारे में जानकारी रखना नहीं है, और इसलिए यह नहीं बताएगा कि हम कौन सा क्या मतलब है? " यह प्रश्न "संबंधित प्रश्न" में प्रकट नहीं होता है, इसलिए बस मेरे जैसे लोगों की मदद करने के लिए, यहां इसका उत्तर दिया गया है: "why do we even need the delete[] operator?"
अच्छा .. शायद मुझे लगता है कि यह केवल स्पष्ट है। ऑपरेटर हटाएं और ऑपरेटर हटाएं [] को प्रतिष्ठित किया गया है लेकिन हटाएं ऑपरेटर सरणी भी जारी कर सकता है।
test* a = new test[100];
delete a;
और पहले से ही इस कोड की जांच कोई यादगार रिसाव नहीं है।
- 1. हटाएं बनाम ऑपरेटर हटाएं (और शून्य पॉइंटर)
- 2. थोक हटाएं (छंटनी बनाम हटाएं)
- 3. ऑपरेटर और सरणी हटाएं?
- 4. हमें "हटाएं []" ऑपरेटर की आवश्यकता क्यों है?
- 5. सार्वजनिक ऑपरेटर नया, निजी ऑपरेटर हटाएं: नए
- 6. jQuery खाली() बनाम हटाएं()
- 7. विज़ुअल सी ++ में इसे हटाएं और हटाएं?
- 8. सी ++ पॉइंटर्स का ऐरे: हटाएं या हटाएं []?
- 9. HTTP विधियां: हटाएं बनाम पोस्ट
- 10. सी ++: एक संरचना हटाएं?
- 11. क्यों "हटाएं [] [] ... multDimensionalArray;" सी ++ में ऑपरेटर मौजूद नहीं है
- 12. हटाएं
- 13. दुविधा: कैस्केड हटाएं या हटाएं
- 14. आईआईएस: कमांड लाइन से वेबपैप को कैसे हटाएं/हटाएं/हटाएं?
- 15. सी ++ नया/हटाएं और चार *
- 16. आईओएस हटाएं बटन - उद्देश्य सी
- 17. सिद्धांत इकाई हटाएं क्वेरी हटाएं, प्रदर्शन तुलना
- 18. नया ओवरलोडिंग/हटाएं
- 19. फ़ंक्शन हटाएं
- 20. हटाएं बटन
- 21. "इसे हटाएं"
- 22. हटाएं बटन
- 23. हटाएं पंक्ति
- 24. एसक्यूएल हटाएं
- 25. एसक्यूएल हटाएं
- 26. वैश्विक "प्लेसमेंट" हटाएं []
- 27. रेगेक्स विशेष वर्ण हटाएं
- 28. सभी निर्देशिका अनुमतियां हटाएं
- 29. अप्रयुक्त संदर्भों को हटाएं (! = "उपयोग")
- 30. सी ++ में फ़ोल्डर को कैसे हटाएं?
आप इस सवाल का मिल सकती है प्रासंगिक http://stackoverflow.com/questions/1913343/how-could-pairing-new-with-delete-possibly-lead-to-memory-leak-only – sharptooth
हटाने के साथ मुद्दों और हटाएं [] एक कारण है कि मुझे स्मार्ट पॉइंटर्स क्यों पसंद हैं, और जब भी मैं कर सकता हूं तो सरणी के बजाय 'वेक्टर <>' का उपयोग करना। –
http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete – sbi