c++ - std::map::iterator crashes program on increment -
इसका कारण क्या हो सकता है?
यहां स्टैक ट्रेस है:
# 0 0x0645c0f5 में std :: _ Rb_tree_increment (__x = 0x83ee5b0) पर ../../../../libstdc++-v3/src/tree.cc:69 # 1 0x0805409a std :: _ Rb_tree_iterator & lt; std :: में जोड़ी & lt; std :: string const, विजेट * & gt; & Gt; :: ऑपरेटर ++ (यह = 0xbffff144) /usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/ पर एलसीसीसीटीआरएल में एलसीडी नियंत्रण केंद्र में ConfigCetup (यह = 0xbffff26c): # # 0x0804ed7c LCDControl में # 4 0x08053d32 में जेनेरिक :: स्टार्टलेआउट (यह = 0x8287d68) जेनरिक सीपीपी: 195 # 3 0x0804f6e1 में मेन सीपीपी: 11
और यहां कोड है:
के लिए (std :: map & lt; std :: string, विजेट * & gt; :: iterator w = widgets_.begin (); w! = Widgets_.end ( ); W ++) {if (w- & gt; दूसरा-> गेटटीप () और amp; WIDGET_TYPE_BAR) {w- & gt; दूसरा-> सेट अप चेर्स (); } W- & gt; दूसरा- & gt; प्रारंभ (); }
संपादित करें: यह अगली समस्या संबंधित है, इसलिए मैं एक नया नया प्रश्न नहीं खोलूंगा मैं जवाब स्वीकृति छोड़ दूँगा जैसे कि यह है। मुझे कुछ जानने की जरूरत है फ़ंक्शन कॉल के बाद मेरे पास दो चलने वाले, एक मुख्य और उस मुख्य में एक है। वे दोनों एक ही मानचित्र से संबंधित हैं ठीक है, अंदर एक सब दूषित हो जाता है, और मुख्य एक का लूप तेज़ी से बंद हो जाता है
यहां कोड है।
यहां प्रारंभ करें:
शून्य जेनेरिक :: स्टार्टलेआउट () {त्रुटि ("स्टार्टलेआउट:% s", कुंजी। c_str ()); (Std :: map & lt; std :: string, विजेट * & gt; :: iterator w = widgets_.begin (); w !: widgets_.end (); w ++) {त्रुटि ("विजिट% s शुरू हो रहा है", w- & gt; first.c_str ()); यदि (w- & gt; दूसरा- gt; GetType () और WIDGET_TYPE_SPECIAL) {w- & gt; दूसरा-> सेटअपचेर्स (); } W- & gt; दूसरा- & gt; प्रारंभ (); }}
और यहां सेटअप चेर्स ():
शून्य विजेटजीफ़ :: सेटअपचेर्स () {त्रुटि ("सेटअप चेर्स & lt;% s & gt; & lt;% s & gt; ; ", Name_.c_str (), widget_base_.c_str ()); त्रुटि ("विजेट का आकार:% d", विज़िटर _- & gt; विजेट्स ()। आकार ()); Std :: नक्शा & lt; std :: स्ट्रिंग, विजेट * & gt; विजेट = विज़ेटर _- & gt; विजेट्स (); (Std :: map & lt; std :: string, विजेट * & gt; :: iterator ii = विज़िटर _- & gt; विजेट्स ()। Begin (); ii! = Visitor _- & gt; विजेट्स ()। End (); ii ++) {त्रुटि ("& lt;% s & gt; विजेट आधार% s ==% s", ii- & gt; प्रथम c_str (), ii- & gt; दूसरा- & gt; गेटव्यूडबेस ()। C_str (), widget_base_.c_str () ); यदि (ii- & gt; दूसरा-> GetWidgetBase () == widget_base_ & amp; ((WidgetGif *) ii- & gt; दूसरा) - & gt; हैशर्स ()) {त्रुटि ("% s से वर्ण का उपयोग करना," ii - & gt; first.c_str ()); (अहस्ताक्षरित int i = 0; i & lt; rows_ * cols_; i ++) {यदि (i & gt; = विज़िटर _- & gt; GetLCDText () - & gt; CHARS) {त्रुटि ("1) जीआईएफ बहुत बड़ी है:% s,% D ", name_.c_str (), विज़िटर _- & gt; GetLCDText () - & gt; CHARS); अगर (update_) update_ को हटा दें; Update_ = नई संपत्ति (विज़िटर_, अनुभाग_, "", नया जेसन :: मान ("- 1")); वापसी; } Ch_ [i] = ((विजेटजीआईफ़ *) विगेट्स [ii- & gt; पहला]) - & gt; गेटचिर्स () [i]; } HasChars_ = true; वापसी; }} // यह चालू है, लेकिन मैंने इसे यहां स्नैप किया है }
और यह है कि क्या होता है:
आरंभलेआउट: display_qt विजेट शुरू हो रहा है widget_gif_american_flag: layout_american_flag: 0 सेटअपचेर्स & lt; widget_gif_american_flag: layout_american_flag: 0 & gt; & LT; layout_american_flag & gt; विगेट्स का आकार: 5 & lt; widget_gif_american_flag: layout_american_flag: 1 & gt; विजेट आधार लेआउट_अमेरिकन_फ्लग == लेआउट_अमेरिकन_फ्लैग & lt; widget_gif_american_flag: layout_american_flag: 4 & gt; विजेट आधार लेआउट_अमेरिकन_फ्लग == लेआउट_अमेरिका_फ्लैग & lt; (n (n S & gt; विजेट आधार> जीएस == लेआउट_अमेरिका_फ्लग ^ सी
अंतिम रूप से संपादित करें: मैंने इसे सोचा था। मुझे इसकी एक प्रति की आवश्यकता थी नए इन्टरेटर के लिए मूल नक्शा।
इसके लिए कुछ कारण हो सकते हैं। ऐसा हो सकता है कि GetType
या SetupChars
या प्रारंभ करें
ऐसा कुछ करें जो आपके नक्शे को बदलने का कारण बनता है - जो वर्तमान इटरेटर को रद्द कर देगा (ध्यान दें कि मैप पर ऑपरेटर []
, यहां तक कि मान पढ़ना, तकनीकी रूप से एक उत्परिवर्तनीय संचालन है, और इरेरेटर डीबगिंग सक्षम होने पर क्रैश हो सकता है!)। वैकल्पिक रूप से, आपका मानचित्र कुछ कोड द्वारा स्मृति में दूषित हो सकता है उदाहरण के लिए, उदाहरण के लिए, बफर की वजह से मैप के पेड़ का ओवरराइंग ओवरराइंग हिस्सा।
Comments
Post a Comment