2013-05-18 7 views
10

मेरे पास std::vector है। मैं अपने आकार की जांच करता हूं जो 6 है लेकिन जब मैं vec[6] तक पहुंचने का प्रयास करता हूं यह जांचने के लिए कि क्या यह त्रुटि देगा, मुझे कोई त्रुटि नहीं है लेकिन इसके बजाय कुछ संख्या है। क्या यह कोई त्रुटि नहीं देनी चाहिए?त्रुटि देने के बिना वेक्टर सीमा से बाहर जा रहे हैं

संपादित करें: की तरह कुछ:

struct Element 
{ 
    std::vector<double> face; 
}; 

int main() 
{ 
    Element elm; 

    .... // insert 6 elements into elm.face 

    std::cout << elm.face.size() << std::endl; // answer is 6 
    std::cout << elm.face[6] << std::endl; // answer is some number 
} 
+1

आकार 6, तो आखिरी है 'vec [5]' – Bill

+1

से शुरू होता है यह सुनिश्चित नहीं है कि आपको यह विचार क्यों मिला कि 'वेक्टर' 'ऑपरेटर []' का उपयोग कर अमान्य अनुक्रमणिका पर त्रुटि डालेगा। दस्तावेज़ निश्चित रूप से अन्यथा कहते हैं। –

+0

'ध्यान दें कि पहले तत्व में 0 (1 नहीं) की स्थिति है। - http://www.cplusplus.com/reference/vector/vector/operator[ ]/ – Bill

उत्तर

27

एसटीएल वैक्टर .at() सदस्य फ़ंक्शन कहलाते समय सीमाओं को जांचते हैं, लेकिन do not perform any checks on the [] operator

सीमाओं से बाहर, [] ऑपरेटर अपरिभाषित परिणाम उत्पन्न करता है।

+7

व्यवहार अपरिभाषित है, इसलिए ** सीमाओं को लागू करने के लिए कार्यान्वयन ** ** ** की अनुमति है; 'एटी' से अंतर यह है कि 'एटी' के लिए सीमा शुल्क ** आवश्यक ** है। –

3

यह अपरिभाषित व्यवहार है। अनिर्धारित व्यवहार का मतलब यह नहीं है कि आपको एक त्रुटि मिलेगी: आप हो सकते हैं, लेकिन इसके बजाय आपको कुछ परिणाम मिल सकते हैं जो अधिक समझ में नहीं आता है।

-1

डेटा संरचनाओं को 0 से शुरू किया गया है, इसलिए यदि आप vec [6] तक पहुंच रहे हैं तो यह सीमा से बाहर होने जा रहा है। स्मृति समस्या के कारण आपको कोई त्रुटि नहीं मिल रही है; आपके द्वारा चलाए गए पिछले कोड से कुछ हो सकता है, या कुछ समान त्रुटि हो सकती है। कृपया कोड पोस्ट करें।

7

जैसा कि kgraney के उत्तर में बताया गया है, यह अपरिभाषित व्यवहार है। हालांकि, अधिकांश सी ++ पुस्तकालयों में ऐसे मामलों में अपवाद बढ़ाने या अपवाद बढ़ाने की कुछ सुविधा है। आमतौर पर विशिष्ट कंपाइलर मैक्रो को सेट या अनसेट करके नियंत्रित किया जाता है।

मैं प्रासंगिक दस्तावेज का अवलोकन बना दिया है:

gnu libstdC++

बजना libcxx

बढ़ावा

  • BOOST_DISABLE_ASSERTS - को निष्क्रिय बढ़ावा पुस्तकालय में इस बात पर ज़ोर।

माइक्रोसॉफ्ट

  • Checked Iterators
  • _ITERATOR_DEBUG_LEVEL - सेट इटरेटर डिबग स्तर
  • Security Features in the CRT
  • _CRT_SECURE_NO_WARNINGS: को निष्क्रिय प्रतिवाद चेतावनी
  • _SCL_SECURE_NO_WARNINGS - कम सुरक्षित (माइक्रोसॉफ्ट के अनुसार) , लेकिन अधिक मानक अनुपालन:

  • _SECURE_SCL - इटरेटर डिबग स्तर

  • _HAS_ITERATOR_DEBUGGING स्थापित करने का पुराना तरीका - पदावनत मैक्रो

ध्यान दें कि gnu और बजना, डिफ़ॉल्ट रूप से जांचों को अक्षम है, जबकि माइक्रोसॉफ्ट उन्हें डिफ़ॉल्ट रूप से सक्षम किया गया है। यदि आप इससे अनजान हैं, तो आपका कोड माइक्रोसॉफ्ट सिस्टम पर डीबग मोड में काफी धीमा हो सकता है।

+0

... माइक्रोसॉफ्ट सिस्टम पर डीबग मोड * में काफी धीमी गति से चल सकता है *। – legalize

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