एसटीडी कॉल :: वेक्टर :: वापस() दुर्घटना मेरा कार्यक्रम मुझे यकीन है कि क्या इस कोड के साथ गलत क्या है नहीं कर रहा हूँ करता है:क्यों
std::vector<int> myVector(0);
if (myVector.back() == 12)
myVector.push_back(12);
ऐसा लगता है कि() वापस बुला एक खाली वेक्टर पर दुर्घटनाओं कार्यक्रम।
मुझे समझ में नहीं आता कि यह क्यों दुर्घटनाग्रस्त हो रहा है? back()
पर कॉल करने से पहले हमें वेक्टर की लंबाई की जांच करने की आवश्यकता है? या यह संभव है कि यह एक बग है?
प्रलेखन कहता है कि यदि वेक्टर खाली है तो यह एक अपरिभाषित मान लौटाता है।
मुझे संदेह है कि यह आपको किसी व्यक्ति को सी ++ मानक के बजाय एमएसडीएन का उपयोग करने के लिए -1 देने के लिए है। कार्यान्वयनकर्ताओं को आगे परिभाषित करने की अनुमति है कि मानक कहां यूबी हैं, उनके मामले में उनके कार्यान्वयन क्या करते हैं, इसलिए अगर एमएस यह गारंटी देना चाहता है कि खाली वेक्टर पर इस्तेमाल होने पर 'बैक()' वापस आ जाएगा, तो वे ऐसा करने के हकदार हैं। यदि आप एमएसवीसी ++ का उपयोग कर रहे हैं तो आप उनके दस्तावेज़ों को पढ़ने के हकदार हैं। लेकिन यह 1 के बजाय यह हो सकता है कि किसी भी तरह से "अपरिभाषित मूल्य" का उपयोग करके, क्रैश हो सकता है। –
@SteveJessop मुझे लगता है कि एमएसडीएन सी ++ मानक का कार्यान्वयन है। लेकिन यह अजीब लगता है कि वैध तत्व पर एक विधि को कॉल करना (जहां तक मुझे खाली पता है वेक्टर एक वैध तत्व है) मेरे प्रोग्राम को दुर्घटनाग्रस्त करता है। वैसे यदि मानक ऐसा कहता है, तो हो सकता है :) – MBen
एमएसवीसी ++ * एक * कार्यान्वयन (लगभग) सी ++ मानक है। अन्य कार्यान्वयन अलग-अलग व्यवहार करते हैं, यदि मानक व्यवहार को नहीं बताता है। एक खाली वेक्टर पर 'बैक()' को कॉल करने के लिए मानक परिभाषित करने का कारण यह नहीं है कि कार्यान्वयन के लिए विशेष-केस कोड की आवश्यकता नहीं है। इसलिए वे यह जांचने के लिए तेज़ होने का विकल्प चुन सकते हैं कि वेक्टर खाली था या नहीं, और अलग-अलग मामलों में अलग-अलग चीजें करते हैं। जब आप कुछ गलत करते हैं तो वे दुर्घटनाग्रस्त हो जाएंगे (या बदतर)। यह अजीब लग सकता है, लेकिन यह भाषा के डिजाइन के हिस्से के रूप में एक व्यापार बंद है। –