2012-06-12 11 views
5

क्या एक ही कीवर्ड का उपयोग कर सरणी को हटाने का कार्यान्वयन करना मुश्किल है? क्या यह कम कुशल है?सी ++ में अभी भी एक डिलीट [] और डिलीट ऑपरेटर क्यों है?

+3

मैं इसे एक वास्तविक प्रश्न * के रूप में चिह्नित करने में संकोच नहीं करता हूं, हालांकि शायद बहुत अच्छी तरह से phrased नहीं है, यह एकीकरण के पीछे तकनीकी चुनौतियों के लिए पूछता है; मेरा मानना ​​है कि उनको संबोधित किया जा सकता है। –

+0

संबंधित प्रश्न: http://stackoverflow.com/q/703691/10077 –

उत्तर

-3

इस तरह की विशेषताएं इसे लागू करने में आसान होने पर भाषा ईवेंट से ही नहीं छोड़ी जा सकती हैं। क्या आप इस तरह के परिवर्तन के बाद मेरे सभी कोड आने और ठीक करने के लिए स्वयंसेवक हैं?

+1

अगर वे इसे छोड़ दिए बिना अप्रचलित हो गए थे, तो वे 'हटाएं []' वाक्यविन्यास को हटा सकते थे, और एक अनुरूप कार्यान्वयन दूसरे को प्रतिनिधि बनाते हैं। –

+0

उन्हें 'auto_ptr' –

+0

' auto_ptr' को छोड़ने में कोई समस्या नहीं थी, एक लाइब्रेरी क्लास है, न कि भाषा का निर्माण, इसलिए यह वही नहीं है, और उपयोगी सुविधा जटिल करने के लिए जरूरी है, अगर आप मुझसे पूछें तो बेवकूफ बेवकूफ है। –

6

समस्या जटिलता नहीं है, लेकिन तथ्य यह है कि delete को तर्क एक भी सूचक है, और उस प्रकार बिल्कुल वैसा ही है कि क्या आप एक भी तत्व या किसी सरणी आवंटित है। कार्यान्वयन के नीचे काफी अलग है, क्योंकि तत्वों की संख्या अलग हो गई है।

यह वास्तव में सी के साथ पिछड़ा संगतता रखने में एक समस्या है ... अगर शुरुआत से इसकी आवश्यकता नहीं थी तो शायद हमारे पास सी ++ नहीं होगा (यह इतना पकड़ा नहीं होगा) लेकिन new T[N] का प्रकार new T के प्रकार से अलग हो और टाइप सिस्टम को delete कहने के लिए उपयोग करने के लिए उपयोग किया जा सकता है।

+1

मुझे लगता है कि ओपी वास्तव में पूछ रहा है कि क्यों 'नया टी' नया टी [1] 'के लिए अलग है। –

+0

जो किसी से पूछने के लिए नेतृत्व कर सकता है, "अगर मैं गिज्मोस की एक सरणी 'नया' कर रहा हूं, तो क्या मैं कभी भी पहले निर्माता पर कॉलर को कॉल करना चाहता हूं?" –

+2

@ ओली क्रिसल्सवर्थ जैसा कि मैंने अपने उत्तर में कहा था: 'नया टी [1]' अतिरिक्त ओवरहेड है, और आपको जो भी उपयोग नहीं है उसके लिए आपको भुगतान नहीं करना चाहिए। –

16

सबसे पहले, मुझे संक्षेप में प्रस्तुत दोनों क्या करते हैं: deleteएक वस्तु के लिए एक नाशक कॉल करता है और स्मृति deallocates; delete[]कुछ वस्तुओं की संख्या के विनाशक को कॉल करता है और स्मृति को हटा देता है।

कोई इन्हें एक ही ऑपरेशन में जोड़ सकता है: "कुछ ऑब्जेक्ट्स की संख्या और स्मृति को नष्ट कर देता है।" सभी एककुछ संख्या के बाद।

delete और delete[] दोनों सूचक पर काम करते हैं। इस तरह:

foo* ptr; 

इसे बारीकी से देखें। और मुझे बताएं कि delete पर कितने विनाशकों को बुलाया जाना चाहिए। आप नहीं कर सकते और इसलिए संकलक नहीं कर सकते हैं। यह केवल रनटाइम पर ही जाना जा सकता है। वस्तुओं की संख्या के बारे में जानकारी कहीं संग्रहीत की जानी चाहिए। इसका मतलब है कि, new[] के प्रत्येक उपयोग के लिए, उस संख्या का ट्रैक रखने के लिए आवंटित कुछ अतिरिक्त स्मृति है।

सी ++ "क्या आप का उपयोग नहीं करते क्या लिए भुगतान नहीं करते" के सिद्धांत पर बनाया गया है, और यही कारण है गैर सरणी रूपों मौजूद है: के बाद से delete हमेशा सिर्फ एक ही वस्तु को हटा देता है, new की जरूरत नहीं है कोई अतिरिक्त आवंटित करें।

+0

अधिक सटीक रूप से, यह एक विरासत समस्या है। 'हटाना (1, पीआरटी)' और 'हटाएं (अभिव्यक्ति, पीआरटी) करने के लिए यह छोटा होगा;' हर कोई जानता है कि उनके पास कितने तत्व हैं। – Puppy

+2

मॉलोक जानता है कि आवंटन अनुरोध के लिए कितनी मेमोरी आवंटित की गई थी। 'हटाएं' एक ही जानकारी से परामर्श कर सकता था। – jxh

+0

@ user315052 तो क्या? 'malloc'' new' नहीं है। आप 'malloc'ed' को हटा नहीं सकते हैं। –

5

ऐसा इसलिए है क्योंकि सी ++ डिज़ाइन के ओवरराइडिंग सिद्धांतों में से एक यह है कि आप जो आप उपयोग नहीं करते हैं उसके लिए भुगतान न करें। new[]/delete[] अतिरिक्त लागत नहीं होती, और यह महसूस किया गया कि उनकी उपयोगिता (मैं ++ सी के 25 वर्षों में तो उपयोग नहीं किया है।) पर्याप्त है कि यह गैर सरणी को यह लागत जोड़ने का औचित्य साबित नहीं किया था सीमित था new/delete

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