2012-12-10 14 views
31

संभव डुप्लिकेट:
is this a variable or function"नया int (100)" क्या करता है?

मैं गलती से की तरह कुछ प्रयोग किया है:

int *arr = new int(100); 

और यह संकलन से गुजरता है, लेकिन मुझे पता था कि यह गलत है। यह

int *arr = new int[100]; 

संकलक क्या सोचता है जब मैंने गलत लिखा था?

उत्तर

56

पहली पंक्ति एक int आवंटित करती है और इसे 100 पर प्रारंभ करती है। एक निर्माता कॉल के रूप में int(100) के बारे में सोचें।

चूंकि यह स्केलर आवंटन है, arr[1] तक पहुंचने का प्रयास कर रहा है या delete[] का उपयोग करके स्मृति को मुक्त करने के लिए अपरिभाषित व्यवहार का कारण बन जाएगा।

+5

@RedX: यदि आप प्लेसमेंट 'new' के बारे में सोच रहे हैं, यह है नहीं यह (सिंटेक्स अलग है)। – NPE

+14

@RedX: नहीं, यह एक गतिशील रूप से आवंटित पते को इंगित करेगा जिसमें 'int' मान 100 है। आप' int * arr = (int *) 100; ' –

+4

@SteveJessop या, जैसा कि एनपीई ने सुझाव दिया है, 'नया (100) int'। –

8

यह int प्रकार की एक वस्तु आवंटित करता है और इसे 100 मानने के लिए प्रारंभ किया जाता है।

new int[100](); 

यह एक आवंटित करेगा:

लोगों का एक बहुत नहीं जानता है कि आप new के लिए एक प्रारंभकर्ता पारित कर सकते हैं, वहाँ एक विशेष मुहावरा है कि और अधिक व्यापक रूप से जाना तो के रूप में memset का उपयोग कर से बचने के लिए किया जाना चाहिए है int की सरणी और इसके तत्वों को शून्य-प्रारंभ करें।

इसके अलावा, आपको new के सरणी संस्करण का उपयोग नहीं करना चाहिए। कभी। उस उद्देश्य के लिए std::vector है।

+1

"एक विशेष मुहावरे जिसे व्यापक रूप से जाना जाना चाहिए ... आपको नए के सरणी संस्करण का उपयोग नहीं करना चाहिए।" तो मुहावरे को व्यापक रूप से क्यों जाना चाहिए? ;-) –

+1

@ स्टेवजेसॉप, अच्छा बिंदु :) हालांकि पुराने कोडबेस को ठीक करते समय, 'वेक्टर' के साथ 'new' को प्रतिस्थापित करने के बजाय 'मेमसेट' को हटाने और कोष्ठक जोड़ने के लिए बहुत आसान है। – avakar

+0

@avakar, मुझे अभी भी इसका मतलब नहीं मिला ... नया int [100](); कोई व्यक्ति उदाहरण के साथ विस्तृत रूप से विस्तृत उदाहरण – eRaisedToX

0

पहला वाला एक एकल पूर्णांक बनाता है, इसे मूल्य 100 में प्रारंभ करता है और इसमें एक सूचक देता है।

सी/सी ++ में एक सरणी के पॉइंटर और एक पॉइंटर के बीच कोई अंतर नहीं है (एक सरणी के लिए सूचक वास्तव में केवल अपने पहले तत्व के लिए एक सूचक है)। तो यह एक तत्व के साथ सरणी बनाने का एक वैध तरीका है।

+4

एक सरणी के लिए एक सूचक 'int (* arr) [100] 'और C++ की तरह दिखता है। यह सिर्फ इतना है कि जब आप एक सरणी आवंटित करते हैं तो भी 'नया' एक संकेतक को एक सरणी में वापस नहीं करता है - इसके बजाय यह सरणी के पहले तत्व को पॉइंटर देता है। इसका कारण यह है कि आकार पॉइंटर-टू-एरे के प्रकार का हिस्सा है, और निश्चित रूप से 'नया' एक अलग प्रकार नहीं लौटा सकता है कि आप इसे किस आकार में चलाते हैं। –

+2

"सी ++ एक सूचक के बीच एक सूचक के तत्व और एक सूचक के लिए एक सूचक के बीच अंतर नहीं कर सकता है।" उद्धरण के लिए –

21

Wikipedia new(C++) बोली:

int *p_scalar = new int(5); //allocates an integer, set to 5. (same syntax as constructors) 
int *p_array = new int[5]; //allocates an array of 5 adjacent integers. (undefined values) 
+1

+1। – Richard

+2

@ रिचर्ड लेकिन मुझे सिखाया गया था कि विकिपीडिया विश्वसनीय स्रोत नहीं है! –

+4

@AlvinWong यह लगभग परिभाषा के अनुसार नहीं है। एकमात्र "विश्वसनीय" स्रोत (इस मुद्दे के लिए) सी ++ मानक होगा (जो आपको उद्धृत करना चाहिए, अगर आप कुछ उद्धृत कर रहे हैं)। –

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