2011-12-28 17 views
7

यहां कोड अंश है।जीसीसी 4.5.1 में इस एसटीएल मानचित्र की प्रविष्टियां क्यों शुरू नहीं की जा रही हैं?

std::map<double, double> temp; 

temp[0] = .1; 

cout << temp[1] << endl; 
// result varies based on compiler 

मैं जीसीसी संस्करण 4.4.1 का उपयोग कर संकलन कर रहा हूँ और मैं temp[1] से 0 मान मिलता है, के रूप में मैं उम्मीद करते हैं। मेरा सहकर्मी जीसीसी संस्करण 4.5.1 पर संकलित कर रहा है। डीबग मोड में (-g ध्वज के साथ), उसे 1000 मिल जाता है। रिलीज मोड संकलित करते समय (-O2 ध्वज), उसे 0 मिल जाता है।

मेरा विचार यह है कि यह समस्या का प्रकार है जो आम तौर पर अनियमित चर के साथ उत्पन्न होता है, सिवाय इसके कि मानचित्र this question और इसके जैसे कई अन्य लोगों के आधार पर उनके तत्वों पर डिफ़ॉल्ट कन्स्ट्रक्टर को कॉल करना चाहते हैं।

इसके अलावा, सी ++ स्टैंडर्ड लाइब्रेरी Josuttis द्वारा, कहा गया है कि

आप सूचकांक, जिसके लिए कोई तत्व अभी तक मौजूद है, एक नए तत्व स्वचालित रूप से नक्शे में डाला जाता है के रूप में एक महत्वपूर्ण का उपयोग करते हैं। नए तत्व का मान है जो इसके प्रकार के डिफ़ॉल्ट कन्स्ट्रक्टर द्वारा प्रारंभ किया गया है।

डीबग मोड में जीसीसी 4.5.1 में मानचित्र में तत्व क्यों प्रारंभ नहीं किए जा रहे हैं? क्या मैं समझ नहीं पा रहा हूं कि दूसरों ने इस व्यवहार के बारे में क्या कहा है? क्या नए तत्वों का डिफ़ॉल्ट निर्माण कुछ ऐसा है जो मानक का हिस्सा नहीं है? या यह संकलक में एक वास्तविक बग हो सकता है?

+2

आप सही हैं। आपके पास कहीं और स्मृति भ्रष्टाचार है। –

+0

क्या आप एक सरल संकलित प्रोग्राम लिख सकते हैं जो समस्या को दोहराता है। ऐसा करने से आमतौर पर आपकी समस्या हल हो जाएगी यदि नहीं तो हम इसे अपने सिस्टम पर जांच सकते हैं। –

उत्तर

1

जैसा कि कोई उम्मीद करेगा, कोड अंश वास्तव में क्या चल रहा है इसका सरलीकृत संस्करण है। यह पता चला है कि मानचित्र पर एक खोज कमांड का उपयोग किया जाता है, ताकि map[1] की बजाय अनिवार्य रूप से map.find(1)->second कहा जा सके। यह अपरिभाषित व्यवहार बताता है।

4

यह आपको जिस तरह से कहता है (प्रिंट 0), और वास्तव में जी ++ 4.5.2 में यह -g, -O2 या दोनों के साथ प्रिंट करता है। यदि यह 0 प्रिंट नहीं कर रहा है तो यह लगभग निश्चित रूप से एक लाइब्रेरी बग है (या आपके सहकर्मी के कार्यक्रम में पहले से ही अपरिभाषित व्यवहार है जिसमें सभी दांव बंद हैं (टीएम))।

2

हां इसे सी ++ मानक के अनुसार 0 में प्रारंभ करने की गारंटी है।

संदर्भ:

सी ++ 03 मानक:

23.3.1.2 मानचित्र तत्व पहुंच[lib.map.access]

T& operator[](const key_type& x);

Returns:(*((insert(make_pair(x, T()))).first)).second.

T() डिफ़ॉल्ट-ऑब्जेक्ट को प्रारंभ करता है। जबकि चर के लिए डिफ़ॉल्ट मान निम्नानुसार हैं:

सी ++ 03 मानक 8।5/5: डिफ़ॉल्ट आरंभ कर

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

अंतिम मामला यहां आपके कोड पर लागू होता है।

+0

'टी()' _value-startizes_ एक ऑब्जेक्ट (§8.5/7)। – ildjarn

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