मैं स्मृति आवंटित कर रहा हूं जिसे बाद में प्लेसमेंट new
के साथ ऑब्जेक्ट्स बनाने के लिए उपयोग किया जाएगा। क्या मुझे operator new(n)
का उपयोग करना चाहिए, या मुझे new unsigned char[n]
का उपयोग करना चाहिए? क्यूं कर?ऑपरेटर नया (एन) बनाम नए हस्ताक्षरित चार [एन] प्लेसमेंट के लिए नया
उत्तर
कारक:
new[]
delete
- साथ
delete[]
/new()
के साथ मिलान किया जाना चाहिए वे अलग बातें संवाद।operator new(n)
अनिर्दिष्ट उद्देश्यों के लिए स्मृति का अनुरोध है, जबकिnew unsigned char[n]
स्पष्ट रूप से वहां वर्णों को संग्रहीत करने का इरादा है।
सरणी रूप हो सकता है थोड़ा खराब प्रदर्शन/दक्षता बुद्धिमान - अपने क्रियान्वयन के आधार पर सटीक विवरण:
5.3.4/12 नई टी [5] नई ऑपरेटर के एक कॉल में परिणाम जहां x एक गैर neagtive अनिर्दिष्ट मान सरणी आवंटन भूमि के ऊपर का प्रतिनिधित्व करता है: नई अभिव्यक्ति का परिणाम
operator new[]
....
BTW द्वारा दिए गए मान से इस राशि की भरपाई हो जाएगा - न initialised कर रहे हैं:
operator new()
रिटर्न uninitialised स्मृति करने के लिए एकvoid*
: 3.7.4.1/2 देख "आवंटन समारोह से लौटने पर आवंटित संग्रहण की सामग्री को बगैर किसी अड़चन हैं", जबकि 5.3.4/15 कहते हैं, "एक नया -एक्सप्रेस जो प्रकार टी की ऑब्जेक्ट बनाता है, उस वस्तु को निम्नानुसार शुरू करता है: यदि नया-प्रारंभकर्ता कम हो जाता है, तो ऑब्जेक्ट डिफ़ॉल्ट-प्रारंभिक (8.5) "होता है; 8.5/6 कहता है कि केवल वर्ग प्रकार डिफ़ॉल्ट कन्स्ट्रक्टर प्रारंभिकरण प्रदान करते हैं।
पूर्व कुछ भंडारण क्षेत्र में एक सूचक लौटाता है। उत्तरार्द्ध इसमें कुछ ऑब्जेक्ट्स के साथ सरणी के पहले तत्व में एक सूचक लौटाता है। यदि आपको भंडारण की आवश्यकता है, तो उस उपकरण का उपयोग करें जो भंडारण देता है और वस्तुओं को नहीं देता है।
क्या अंतर है? क्या वे दोनों अनियंत्रित नहीं हैं? या आप बस यह कह रहे हैं कि यह एक पठनीयता मुद्दा है? – Mehrdad
@Elazar No. 'ऑब्जेक्ट नया [n] 'के साथ कोई ऑब्जेक्ट प्रारंभ नहीं हुआ है। 'नया हस्ताक्षरित चार [n]' डिफ़ॉल्ट- 'हस्ताक्षरित चार' की सरणी शुरू करता है (और 'हस्ताक्षरित चार' का डिफ़ॉल्ट प्रारंभ प्रारंभ नहीं करता है)। –
@ एलिज़र: न तो आरंभ किया गया है - मेरे उत्तर में मानक संदर्भ प्रदान किए गए हैं। –
- 1. मिक्सिंग ऑपरेटर नया [] और साधारण हटाने के साथ नया प्लेसमेंट []
- 2. क्या हमें अभी भी "प्लेसमेंट नया" और "ऑपरेटर नया" चाहिए?
- 3. प्लेसमेंट नया मुद्दा
- 4. Constexpr प्लेसमेंट नया?
- 5. सार्वजनिक ऑपरेटर नया, निजी ऑपरेटर हटाएं: नए
- 6. "नया" ऑपरेटर और "नया" फ़ंक्शन
- 7. std :: आवंटक बनाम/बनाम बनाम प्लेसमेंट नया/पी-> ~ टी()
- 8. स्कैला: स्लाइडिंग (एन, एन) बनाम समूहित (एन)
- 9. बढ़ावा :: make_shared कॉलिंग (प्लेसमेंट) ऑपरेटर नया नहीं है?
- 10. नया क्या चार [10] और नए चार (10)
- 11. टेम्पलेट आकार के आधार पर नया प्लेसमेंट()
- 12. नया इंस्टेंस() बनाम नया
- 13. 'नया' ऑपरेटर
- 14. ग्राफ में नया किनारा जोड़ें और ओ (एन)
- 15. स्कैला - नया बनाम ऑब्जेक्ट
- 16. एन ** एन ** एन पाइरॉन
- 17. size_t पैरामीटर नया ऑपरेटर
- 18. एन-टियरड बनाम एन-स्तरित वास्तुकला/डिजाइन
- 19. यह गलत नया चार [n]
- 20. एन * एन ग्रिड
- 21. एन * (कनेक्ट + भेजें + बंद करें) बनाम (नागल अक्षम + कनेक्ट + एन * भेजें + बंद करें), एन> 1
- 22. प्लेसमेंट को नुकसान पहुंचाए बिना डीबग संस्करण के साथ नया ओवरराइड करना नया
- 23. सी ++ नया/हटाएं और चार *
- 24. ओ (एन लॉग एन) समय
- 25. सूचियाँ। नया ऑरेलेस्ट बनाम नया ऐरेलिस्ट
- 26. मंद एन के टेंसर की सूची को मंद एन + 1
- 27. क्या ओ (एन * एन) ओ (एन)
- 28. स्क्वायरिंग एन-बिट int बनाम दो एन-बिट इन्स गुणा
- 29. एंड्रॉइड एन
- 30. एन ++
मुझे लगता है कि या तो ठीक होगा। –
@sftrabbit: तो संरेखण, अर्थशास्त्र, प्रदर्शन, या ऐसा कुछ के मामले में कोई अंतर नहीं है? – Mehrdad
@ मेहरदाद * "अर्थशास्त्र" * - वास्तव में अंतर है। –