2010-03-10 15 views
7

में आईटेटर लिस्ट कॉर्रूप्टेड वीएस2005 एसपी 1 में डीबग कॉन्फ़िगरेशन में संकलित नीचे दिए गए कोड में "आईटेटर लिस्ट कॉर्रूटेड" नोटिस के साथ दो संदेश दिखाए गए हैं।एसटीडी :: स्ट्रिंग कन्स्ट्रक्टर

कोड स्निपेट

#define _SECURE_SCL 0 
#define _HAS_ITERATOR_DEBUGGING 0 

#include <sstream> 
#include <string> 

int main() 
{ 
    std::stringstream stream; 
    stream << "123" << std::endl; 
    std::string str = stream.str(); 
    std::string::const_iterator itFirst = str.begin(); 
    int position = str.find('2'); 
    std::string::const_iterator itSecond = itFirst + position; 
    std::string tempStr(itFirst,itSecond); ///< errors are here 
    return 0; 
} 

यह संकलक या मानक पुस्तकालय में एक बग है?

+0

वीएस 2008 में भी मेरे साथ होता है। चित्त आकर्षण करनेवाला। – avakar

+0

gcc के खिलाफ परीक्षण के लिए codepad.org का उपयोग करने पर विचार करें: http://codepad.org/mXXYxf99 यह निश्चित रूप से एक विंडोज़/विजुअल स्टूडियो बग है। कृपया इसकी रिपोर्ट करें। –

उत्तर

2

क्या @dirkgently ने अपने संपादन में कहा।

जाहिर है, std::string के लिए कुछ कोड क्रम dll में स्थित है, विशेष रूप से मैक्रो परिभाषा नहीं प्रभाव निर्माता एक इटरेटर डिबगिंग के लिए कोड का निष्पादित के लिए ले करता है। आप रनटाइम लाइब्रेरी को स्थिर रूप से लिंक करके इसे ठीक कर सकते हैं।

मैं इसे एक बग पर विचार करता हूं, हालांकि शायद विजुअल स्टूडियो में नहीं, बल्कि दस्तावेज़ीकरण में।

+0

धन्यवाद। लिंकिंग स्थिर रूप से समस्या हल करती है। –

3

मेरा बुरा! संपादित करें: कंपाइलर के साथ हाँ समस्या। this देखें - खासकर सामुदायिक सामग्री अनुभाग।

+0

आपका क्या मतलब है? 'std :: string' में यादृच्छिक-पहुंच इटरेटर हैं। – avakar

+0

कोड संकलित करने योग्य क्यों है? – Vlad

0

आपके कोड में कोई समस्या है। ठीक है, वास्तव में कई:

  1. std.find('2') रिटर्न एक size_t, आप एक संभावित डाली समस्या है, तो size_t का मान दिया (जैसे std::string::npos) क्या एक int पकड़ सकता से बेहतर है (यदि आप एक नकारात्मक के साथ खत्म होगा पूर्णांक मुझे लगता है कि ...)
  2. अगर position तो सीमा itFirst,itSecond ख़राब ढंग से परिभाषित किया जाता है, नकारात्मक या std::string::npos के बराबर है (या तो itSeconditFirst से पहले है या क्योंकि क्योंकि यह अतीत है str.end())

अपना कोड सही करें, और जांचें कि यह अभी भी फेंक रहा है या नहीं। इटरेटर डिबगिंग इन गलतियों को पकड़ने में आपकी सहायता के लिए यहां है, इसे शुतुरमुर्ग की तरह अभिनय करने में अक्षम बनाता है।

+1

खोजने का स्ट्रिंग संस्करण() वास्तव में एक std :: string :: size_type देता है। –

+0

आम तौर पर आप सही हैं, लेकिन इस विशिष्ट मामले में '_HAS_ITERATOR_DEBUGGING' बंद कर दिया गया है। यदि आप '_HAS_ITERATOR_DEBUGGING' को 1 पर सेट करते हैं तो कोई त्रुटि नहीं होगी। इस प्रकार, सीआरटी में एक बग प्रतीत होता है। – Paul

+0

@Neil: सत्य, और अधिकांश कंटेनर प्रभावी रूप से सभी इंडेक्सिंग उद्देश्य के लिए एक आंतरिक टाइपिफ़ 'आकार_ प्रकार' का उपयोग करते हैं, जिसे मैंने कभी भी एसटीएल के कुछ (कुछ) कार्यान्वयन में 'size_t' के अलावा अन्य नहीं देखा है। वास्तविक समस्या यह है कि अक्सर यह एक हस्ताक्षरित मूल्य नहीं है (क्योंकि नकारात्मक में अनुक्रमण करना समझ में नहीं आता है, जब तक कि आप मीठे पायथन का उपयोग नहीं कर रहे हों)। –

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