2010-10-10 16 views

उत्तर

51

पहले 10 char की सरणी आवंटित करता है।

पहले std::vector<char> साथ प्रतिस्थापित किया जाना चाहिए, दूसरा एक स्मार्ट सूचक में रखा जाना चाहिए: दूसरा एक चार से 10

या करने के लिए प्रारंभ आवंटित करता है।

+3

क्या आप हमें स्मार्ट पॉइंटर्स के बारे में बता सकते हैं? –

+1

@ ग्रीन: एह, [यह] (http://stackoverflow.com/questions/94227/smart-pointers-or-who-owns-you-baby) एक अच्छी शुरुआत है। मेरे द्वारा – GManNickG

+0

+1। जब मैं देखता हूं कि एक पूरी तरह से सही उत्तर के लिए एक अज्ञात डाउनवोट था, तो मैं हमेशा इसे "पासिंग इगोरैमस" तक चलाता हूं। –

14
new char[10]; 

गतिशील, एक चार [10] (चार की सरणी, लंबाई 10), अनिश्चित मूल्यों के साथ आवंटित करता है, जबकि

new char(10); 

फिर, गतिशील रूप से एक भी चार आबंटित करता है, 10 के एक पूर्णांक मान के साथ।

0

वैसे पहला वाला एक सरणी बना देगा। लेकिन मुझे लगता है कि आपका प्रश्न अधिकतर दूसरे पर है। आपका कोड मान्य वर्ण के रूप में उपयोग कर सकते हैं, पर विचार करें:

char * x ; 
cin >> *(x=new char()) ; 

एक चरित्र को गतिशील बनाने के लिए और फिर stdin से इसे पढ़ा जाएगा।

+4

सिर्फ इसलिए कि किसी ऑब्जेक्ट का आकार एक का मतलब यह नहीं है कि यह एक char है। साथ ही, आप संभवतः उस चर को कैसे हटा सकते हैं? (जब आपको नहीं करना है तो गतिशील रूप से आवंटित न करें।) "हटाना न भूलें" -> खराब सी ++ कोड। – GManNickG

+0

आप सही हैं, लेकिन मैं सिर्फ हमारे मित्र को दिखाना चाहता था कि जिन लोगों ने सी ++ बनाया है, उन्होंने इसे किसी उद्देश्य के लिए बनाया है। मुझे इसे सिने के साथ इस्तेमाल नहीं करना चाहिए था और इसका कोई संदर्भ नहीं था। –

6
char *a = new char[10]; 
... 
delete [] a; 

ऊपर गतिशील आवंटित करता है और 10 सन्निहित स्मृति स्लॉट है कि वर्ण स्टोर करने के लिए इस्तेमाल किया जा सकता deallocates।

char *a = new char(10); 
... 
delete a; 

ऊपर गतिशील आवंटित करता है और एक स्मृति स्लॉट है कि पूर्णांक मान 10 साथ आरंभ नहीं हो जाता, चार मूल्य '\n' के बराबर deallocates।


std::vector<T> उपयोग नहीं करते हैं तो आपको पहले संकेत समझ में नहीं आता। यह जानकर कि स्मृति आवंटन और पॉइंटर्स कैसे काम करते हैं आपको एक बेहतर प्रोग्रामर बना देगा।

+2

यह मौजूदा उत्तरों में क्या जोड़ता है? और आपका दूसरा आधा पूरी तरह से राय है, और वास्तव में आधुनिक सी ++ समुदाय में काफी असहमत है। लोगों को काले बक्से सौंपना बेहतर होता है, * फिर * उन्हें दिखाएं कि यह कैसे काम करता है और हम उनका उपयोग क्यों करते हैं। मैन्युअल मेमोरी मैनेजमेंट खराब सी ++ है, फिर भी लोगों को खराब सी ++ सिखाकर क्यों शुरू करें? – GManNickG

+0

10 मेमोरी स्लॉट संगत हैं, std :: vector पर टिप्पणी, (char) 10 == '\ n' ~~ मुझे मत छोड़ो क्योंकि मैं आपकी भावनाओं को चोट पहुंचाता हूं। – Squirrelsama

+0

आपने दूसरे छमाही में संपादित किया, मैंने मिलान करने के लिए अपनी टिप्पणी संपादित की। इसके अलावा, सभी तीन मौजूदा उत्तरों का कहना है कि यह एक "सरणी" है। Arrays हमेशा संगत होते हैं। साथ ही, '' \ n '' अनिवार्य रूप से 10 होना आवश्यक नहीं है, यह आपके चरित्र सेट पर निर्भर करता है। – GManNickG

1

मैं नहीं बल्कि प्रयोग करेंगे:

size_t size = 10; //or any other size 
std::string buff(size, 0); //or: std::string buff(size, '\0'); 

अब अगर आप चार * शौकीन का उपयोग करना चाहिए, तो आप उपयोग कर सकते हैं:

&buff[0] 

आप स्थिरांक चार उपयोग करने के लिए * तो आप उपयोग कर सकते हैं की जरूरत है :

buff.c_str() 

बड़ा लाभ यह है कि आपको स्मृति को रद्द करने की आवश्यकता नहीं है, एसएलएल आपके लिए इसका ख्याल रखता है। अगला लाभ यह है कि आप सभी एसटीएल स्ट्रिंग फ़ंक्शंस का उपयोग कर सकते हैं

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