2010-02-26 137 views
6

आज, मुझे पता चला है कि आप C++ में इस तरह के कोड लिख सकते हैं और यह संकलन कर सकते हैं:यह गतिशील आवंटन क्या करता है?

int* ptr = new int(5, 6); 

इस का उद्देश्य क्या है? मैं निश्चित रूप से गतिशील new int(5) चीज़ जानता हूं, लेकिन यहां मैं खो गया हूं। कोई सुराग?

+4

क्या इसके लायक है के लिए, इस मामले में यह करने के लिए सही तरीका 'पूर्णांक * ptr = नई int है ((5, 6));'। 'int (5,6) 'के परिणामस्वरूप एक त्रुटि होनी चाहिए, लेकिन इसे कोष्ठक में रखकर इसे 6 में बदल दिया जाता है, फिर इसका उपयोग करता है। उसने कहा, यह बदसूरत है। :) – GManNickG

+0

@GMan: आपको इसे एक उत्तर के रूप में रखना चाहिए, ताकि हम इसे ऊपर उठा सकें। – Zacky112

उत्तर

13

आप अल्पविराम ऑपरेटर का उपयोग कर रहे हैं, यह केवल एक मान (दाएं) का मूल्यांकन करता है।

अल्पविराम ऑपरेटर (,) अलग दो या अधिक भाव किया जाता है कि शामिल किए गए हैं जहां केवल एक अभिव्यक्ति की उम्मीद है। अभिव्यक्तियों का सेट मान के लिए मूल्यांकन किया जाना चाहिए, केवल सही अभिव्यक्ति माना जाता है।

Source

स्मृति पता है कि सूचक ऊपर 6 के एक मूल्य के साथ आरंभ नहीं हो जाता की ओर इशारा करते है।

+0

ऑपरेटर (,) अपने पहले ऑपरेंड को छोड़ देता है, यह नई int (6) जैसा ही है। सही? – Stringer

+3

हां यह सही है। लेकिन आपके पास 5 की बजाय कुछ अन्य अभिव्यक्ति हो सकती है जिसे आप मूल्यांकन करना चाहते हैं और 6 लौटाए गए हैं। यह सभी अभिव्यक्तियों का मूल्यांकन करेगा लेकिन अंतिम एक लौटाएगा। –

+1

http://msdn.microsoft.com/en-us/library/zs06xbxh(VS.80).aspx लेकिन उस लिंक पर माइक्रोसॉफ्ट का कहना है, "जहां अल्पविराम आमतौर पर विभाजक के रूप में उपयोग किया जाता है (उदाहरण के लिए कार्यों के लिए वास्तविक तर्क या कुल प्रारंभकर्ता), अल्पविराम ऑपरेटर और इसके संचालन कोष्ठक में संलग्न होना चाहिए। " Int (अभिव्यक्ति) में एक तर्क सूची के रूप में अभिव्यक्ति नहीं होगी और इसलिए अल्पविराम का मूल्यांकन एक सेपरेटर के रूप में नहीं किया जाएगा? – Bob

1

मेरा कंपाइलर, जी ++, ऐसा करने का प्रयास करते समय एक त्रुटि देता है।

आप इसे किस कंपाइलर या कोड में देखते थे?

+0

विजुअल स्टूडियो 2008. मैंने वह कोड लिखा था। – Stringer

+0

यह एमएसवीसी 6.0 में संकलित करता है और मूल्य 6 के साथ स्थान पीआरटी शुरू करता है। –

1

मुझे विश्वास है कि यह बग है जिसका मतलब है कि 2 डी सरणी आवंटित करना है। हालांकि आप इसे C++ में नहीं कर सकते हैं। स्निपेट वास्तव में संकलित करता है क्योंकि यह अल्पविराम ऑपरेटर का उपयोग कर रहा है, जो अंतिम अभिव्यक्ति देता है और अन्य सभी के परिणामों को अनदेखा करता है। इसका मतलब है कि कथन के बराबर है:

int* ptr = new int(6); 
1

5 को अनदेखा किया गया है। यह ढेर पर एक int आवंटित करता है और इसे शुरू करता है (5,6)।

अल्पविराम ऑपरेटर द्वारा अलग बयान का एक सेट का परिणाम पिछले बयान का मूल्य है, इसलिए पूर्णांक 6

1

को आरंभ नहीं हो जाता, बस ऐसा करते हैं:

int* ptr = new int(6); 

अल्पविराम के रूप में जहाँ तक ऑपरेटर चिंतित है, इसका उपयोग तब करें जब आप इसके बिना वांछित कार्य नहीं कर सकते। जैसे लागू करने के गुर का कोई उपयोग नहीं है:

int* ptr = new int(5, 6); 
संबंधित मुद्दे