क्या एक ही कीवर्ड का उपयोग कर सरणी को हटाने का कार्यान्वयन करना मुश्किल है? क्या यह कम कुशल है?सी ++ में अभी भी एक डिलीट [] और डिलीट ऑपरेटर क्यों है?
उत्तर
इस तरह की विशेषताएं इसे लागू करने में आसान होने पर भाषा ईवेंट से ही नहीं छोड़ी जा सकती हैं। क्या आप इस तरह के परिवर्तन के बाद मेरे सभी कोड आने और ठीक करने के लिए स्वयंसेवक हैं?
अगर वे इसे छोड़ दिए बिना अप्रचलित हो गए थे, तो वे 'हटाएं []' वाक्यविन्यास को हटा सकते थे, और एक अनुरूप कार्यान्वयन दूसरे को प्रतिनिधि बनाते हैं। –
उन्हें 'auto_ptr' –
' auto_ptr' को छोड़ने में कोई समस्या नहीं थी, एक लाइब्रेरी क्लास है, न कि भाषा का निर्माण, इसलिए यह वही नहीं है, और उपयोगी सुविधा जटिल करने के लिए जरूरी है, अगर आप मुझसे पूछें तो बेवकूफ बेवकूफ है। –
समस्या जटिलता नहीं है, लेकिन तथ्य यह है कि delete
को तर्क एक भी सूचक है, और उस प्रकार बिल्कुल वैसा ही है कि क्या आप एक भी तत्व या किसी सरणी आवंटित है। कार्यान्वयन के नीचे काफी अलग है, क्योंकि तत्वों की संख्या अलग हो गई है।
यह वास्तव में सी के साथ पिछड़ा संगतता रखने में एक समस्या है ... अगर शुरुआत से इसकी आवश्यकता नहीं थी तो शायद हमारे पास सी ++ नहीं होगा (यह इतना पकड़ा नहीं होगा) लेकिन new T[N]
का प्रकार new T
के प्रकार से अलग हो और टाइप सिस्टम को delete
कहने के लिए उपयोग करने के लिए उपयोग किया जा सकता है।
मुझे लगता है कि ओपी वास्तव में पूछ रहा है कि क्यों 'नया टी' नया टी [1] 'के लिए अलग है। –
जो किसी से पूछने के लिए नेतृत्व कर सकता है, "अगर मैं गिज्मोस की एक सरणी 'नया' कर रहा हूं, तो क्या मैं कभी भी पहले निर्माता पर कॉलर को कॉल करना चाहता हूं?" –
@ ओली क्रिसल्सवर्थ जैसा कि मैंने अपने उत्तर में कहा था: 'नया टी [1]' अतिरिक्त ओवरहेड है, और आपको जो भी उपयोग नहीं है उसके लिए आपको भुगतान नहीं करना चाहिए। –
सबसे पहले, मुझे संक्षेप में प्रस्तुत दोनों क्या करते हैं: delete
एक वस्तु के लिए एक नाशक कॉल करता है और स्मृति deallocates; delete[]
कुछ वस्तुओं की संख्या के विनाशक को कॉल करता है और स्मृति को हटा देता है।
कोई इन्हें एक ही ऑपरेशन में जोड़ सकता है: "कुछ ऑब्जेक्ट्स की संख्या और स्मृति को नष्ट कर देता है।" सभी एककुछ संख्या के बाद।
delete
और delete[]
दोनों सूचक पर काम करते हैं। इस तरह:
foo* ptr;
इसे बारीकी से देखें। और मुझे बताएं कि delete
पर कितने विनाशकों को बुलाया जाना चाहिए। आप नहीं कर सकते और इसलिए संकलक नहीं कर सकते हैं। यह केवल रनटाइम पर ही जाना जा सकता है। वस्तुओं की संख्या के बारे में जानकारी कहीं संग्रहीत की जानी चाहिए। इसका मतलब है कि, new[]
के प्रत्येक उपयोग के लिए, उस संख्या का ट्रैक रखने के लिए आवंटित कुछ अतिरिक्त स्मृति है।
सी ++ "क्या आप का उपयोग नहीं करते क्या लिए भुगतान नहीं करते" के सिद्धांत पर बनाया गया है, और यही कारण है गैर सरणी रूपों मौजूद है: के बाद से delete
हमेशा सिर्फ एक ही वस्तु को हटा देता है, new
की जरूरत नहीं है कोई अतिरिक्त आवंटित करें।
अधिक सटीक रूप से, यह एक विरासत समस्या है। 'हटाना (1, पीआरटी)' और 'हटाएं (अभिव्यक्ति, पीआरटी) करने के लिए यह छोटा होगा;' हर कोई जानता है कि उनके पास कितने तत्व हैं। – Puppy
मॉलोक जानता है कि आवंटन अनुरोध के लिए कितनी मेमोरी आवंटित की गई थी। 'हटाएं' एक ही जानकारी से परामर्श कर सकता था। – jxh
@ user315052 तो क्या? 'malloc'' new' नहीं है। आप 'malloc'ed' को हटा नहीं सकते हैं। –
ऐसा इसलिए है क्योंकि सी ++ डिज़ाइन के ओवरराइडिंग सिद्धांतों में से एक यह है कि आप जो आप उपयोग नहीं करते हैं उसके लिए भुगतान न करें। new[]
/delete[]
अतिरिक्त लागत नहीं होती, और यह महसूस किया गया कि उनकी उपयोगिता (मैं ++ सी के 25 वर्षों में तो उपयोग नहीं किया है।) पर्याप्त है कि यह गैर सरणी को यह लागत जोड़ने का औचित्य साबित नहीं किया था सीमित था new
/delete
।
- 1. सी ++ में एक डिलीट [] क्यों है?
- 2. डिलीट ऑपरेटर को स्थिर होने की आवश्यकता क्यों है?
- 3. सबवर्सन एक डिलीट कमांड
- 4. जावास्क्रिप्ट में डिलीट ऑपरेटर का उद्देश्य क्या है?
- 5. जावास्क्रिप्ट 'डिलीट' पुनरावृत्ति लूप
- 6. प्लेफ्रेमवर्क में कैस्केडिंग डिलीट-एंटिटीज
- 7. रीस्टफुल पुट और डिलीट और फ़ायरवॉल
- 8. जब मैं एक नल पॉइंटर पर "हटाएं" कहता हूं तो "ऑपरेटर डिलीट" क्यों होता है?
- 9. NSManagedObject की डिलीट विधि
- 10. एक रिकर्सिव डिलीट फ़ंक्शन (PHP में)
- 11. मैं मॉडल पर डिलीट() को ओवरराइड कैसे कर सकता हूं और यह अभी भी संबंधित डेलेट
- 12. फ़ाइल। डिलीट() बनाम FileInfo.Delete()
- 13. स्मार्ट पॉइंटर रिकर्सिव डिलीट
- 14. SQL सर्वर ऑन डिलीट ट्रिगर
- 15. जेपीए: यूनिडायरेक्शनल कई से एक और कैस्केडिंग डिलीट
- 16. क्या सी ++ में डिलीट ऑपरेटर के लिए सही प्रकार आवश्यक है?
- 17. एंटिटी फ्रेमवर्क माइग्रेशन कैस्केड डिलीट कॉन्फ़िगरेशन में भी WillCascadeOnDelete (false) भी सत्य है
- 18. इंटरवलट्री डिलीट नोड जावा कार्यान्वयन
- 19. मेरी डिलीट कुंजी ओएस एक्स
- 20. सी ++ डिलीट ऑपरेटर को पॉलिमॉर्फिक ऑब्जेक्ट का मेमोरी लोकेशन कैसे मिलता है?
- 21. सी # में डिलीट कुंजी प्रेस कैप्चर कैसे करें?
- 22. क्या कोई मानक डिलीट फिक्सर है?
- 23. ग्रिड व्यू में डिलीट बटन कैसे बनाएं?
- 24. कई से कई एसोसिएशन टेबल में एक डिलीट कैस्केडिंग?
- 25. वास्तव में पंक्तियों को हटाने के लिए डिलीट rawQuery को एक चाल की आवश्यकता क्यों है?
- 26. एंटिटी फ्रेमवर्क के साथ कैस्केडिंग डिलीट - ईएफ
- 27. सी ++ 0x में ऑपरेटर क्यों है ... ऑपरेटर?
- 28. एसक्यूएल डिलीट - पंक्तियों की अधिकतम संख्या
- 29. सी में अभी भी "लंबा" उपयोगी है?
- 30. "डिलीट कैस्केड" बाधाओं को कैसे जोड़ा जाए?
मैं इसे एक वास्तविक प्रश्न * के रूप में चिह्नित करने में संकोच नहीं करता हूं, हालांकि शायद बहुत अच्छी तरह से phrased नहीं है, यह एकीकरण के पीछे तकनीकी चुनौतियों के लिए पूछता है; मेरा मानना है कि उनको संबोधित किया जा सकता है। –
संबंधित प्रश्न: http://stackoverflow.com/q/703691/10077 –