2012-03-06 10 views
5

एसटीएल कंटेनर का उपयोग करते समय, मुझे यकीन नहीं है कि डिफ़ॉल्ट आवंटक द्वारा आवंटित एक int को शून्यकृत किया गया है या नहीं। निम्नलिखित कोड सवाल का 'हां' इंगित करता है: कोई दस्तावेज़ इस की पुष्टि की हैक्या डिफ़ॉल्ट आवंटक intize शून्य है?

#include <map> 
#include <iostream> 

int main() { 
    using namespace std; 
    map<int, int> m; 
    cout << m[1234] << endl; 
} 

के बाद से, मैं प्रदान करने के लिए इसे ले करने की हिम्मत नहीं है।

+1

आवंटक डिफ़ॉल्ट-निर्माण करेगा। यह रिलीज होना चाहिए: RobH

+0

या, एमएसडीएन से: RobH

+0

@RobH लिंक काम नहीं करता है। –

उत्तर

6

आप std::map::operator[] के कार्यान्वयन के अंदर, देखेंगे, अगर तत्व सूचकांक में नहीं पाया जाता है, एक नया एक डाला जाता है और वापस आ जाता है:

ReturnValue = this->insert(where, make_pair(key_value, mapped_type())); 

जहां mapped_type, दूसरे प्रकार है आपके मामले में int। तो हाँ, यह डिफ़ॉल्ट है- 0 में प्रारंभ किया गया है, क्योंकि इसे mapped_type() के रूप में डाला गया है।

+0

मुझे पता है कि एक int डाला जाएगा, लेकिन मुझे यकीन नहीं है कि यह शून्यकृत है या नहीं। मुझे यकीन नहीं है कि 'नया int' सूचक को 0 – peter

+0

@ पीटर पर वापस कर देगा, यह 'int int' नहीं है, यह' int() 'है, जो' 0' उत्पन्न करेगा। –

+0

@ पीटर: यह एक और सवाल है (नहीं; इसके लिए 'नया int() 'का उपयोग करें)। 'std :: map' indiviudal' int' ऑब्जेक्ट्स आवंटित नहीं करता है, लेकिन नोड्स जिनमें प्रत्येक 'जोड़ी <कुंजी, मैप्ड वैल्यू> ' – MSalters

6

मानक गारंटी देता है कि सबस्क्रिप्ट ऑपरेटर का उपयोग करने के परिणामस्वरूप बनाई गई वस्तुओं को डिफ़ॉल्ट रूप से बनाया गया है। चाहे किसी विशेष वर्ग के लिए डिफॉल्ट कन्स्ट्रक्टर उन सदस्यों को ज़रूरी करता है जिन्हें आप शून्य होने की उम्मीद करते हैं, वे क्लास पर हैं। बिना रचनाकारों के वर्गों के वर्गों के लिए डिफ़ॉल्ट रूप से निर्मित होते हैं और डिफ़ॉल्ट निर्माण मौलिक प्रकार "शून्य" के संस्करण को सेट करने के लिए होते हैं।

नोट, इसमें कुछ भी आवंटकों के साथ करने के लिए नहीं है! ... और यह मानना ​​बहुत सुरक्षित है कि टीबी आवंटकों ने स्मृति को बिना छेड़छाड़ की छोड़ दी है, संभवतः समर्पित डिबगिंग आवंटकों को छोड़कर (या लोगों द्वारा लिखे गए आवंटकों को यह सोचने में धोखा दिया जाता है कि स्मृति को शून्य करना डिवाइस की छिपाने की बजाए अच्छी चीज हो सकती है)। ... और डिबगिंग आवंटक स्मृति को शून्य नहीं करेगा लेकिन इसे पहचानने योग्य पैटर्न से भर देगा (उदाहरण के लिए हेक्साडेसिमल में देखे जाने पर 0xdeadbeef)।

+0

+1। –

2

हो सकता है कि यह: 8.5.5 initializers सी ++ स्टैंडर्ड - एएनएसआई आईएसओ आईईसी 14882 2003

के प्रकार टी का एक उद्देश्य शून्य से प्रारंभ का अर्थ है: अगर टी एक अदिश प्रकार (3.9), वस्तु है टी में परिवर्तित 0 (शून्य) के मान पर सेट है;

1

ऐसा लगता है कि डिफ़ॉल्ट आवंटक टेम्पलेट new int() का उपयोग डिफ़ॉल्ट रूप से 0 से शुरू करने के लिए करेगा, सी ++ आईएसओ मानक 14882: 2003 के अनुसार। अध्याय 8.5, खण्ड-5,7:

करने के लिए शून्य से प्रारंभ प्रकार टी की एक वस्तु का अर्थ है:

  • अगर टी एक अदिश प्रकार (3.9) है, वस्तु पर सेट है 0 (शून्य) का मूल्य टी में परिवर्तित किया गया;

करने के लिए मूल्य-प्रारंभ प्रकार टी की एक वस्तु का अर्थ है:

  • अगर टी एक वर्ग प्रकार (खंड 9) एक उपयोगकर्ता के घोषित निर्माता (12 के साथ है।1), तो टी के लिए डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है (और प्रारंभिकता बीमार है यदि टी के पास कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है);

  • यदि टी उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर के बिना गैर-यूनियन क्लास प्रकार है, तो प्रत्येक गैर स्थैतिक डेटा सदस्य और टी के बेस-क्लास घटक मूल्य-प्रारंभिक होते हैं;

  • यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व मूल्य-प्रारंभिक है;

  • अन्यथा, वस्तु शून्य आरंभ नहीं हो जाता

करने के लिए डिफ़ॉल्ट आरंभ कर प्रकार टी की एक वस्तु का अर्थ है:

  • अगर टी एक गैर पॉड वर्ग प्रकार है (खंड 9), टी के लिए डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है (और प्रारंभिकता बीमार है यदि टी के पास कोई सुलभ डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है);

  • यदि टी एक सरणी प्रकार है, तो प्रत्येक तत्व डिफ़ॉल्ट-प्रारंभ होता है;

  • अन्यथा, ऑब्जेक्ट शून्य-प्रारंभिक है।

एक ऑब्जेक्ट जिसका प्रारंभकर्ता कोष्ठक का एक खाली सेट है, यानी,(), मूल्य-प्रारंभिक होगा।

सी ++ 11 आईएसओ मानक ड्राफ्ट में भी इसी तरह के नियम हैं।

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