2012-09-20 21 views
7
//fills my vector with pointers. 
//(some are pointing places, others are set to nullptr 
vector<Tree_NodeT*> xml_trees {Build_Tree_List(program_options->Get_Files())}; 

//time to print them 
for (auto tree = xml_trees.begin(); tree != xml_trees.end(); ++tree){ 
    if (*tree){ 
     (*tree)->Print(std::cout,4); 
    } 
} 
//this worked! No Segfaults! 

//time to print them again 
for (auto tree : xml_trees){ 
    if (tree){ 
     tree->Print(std::cout,4); 
    } 
} 
//Crash! Segfault. 

दूसरा लूप segfaulting क्यों है, जबकि पहला लूप नहीं है?सी ++ 11 सेगफॉल्ट में लूप के लिए रेंज-आधारित, लेकिन नियमित रूप से लूप

+0

पॉइंटर अव्यवस्था? कोई विचार नहीं, बस मेरे गधे से बाहर सोच रहा है –

+3

स्पष्टीकरण के लिए, अभी तक सी ++ 11 के साथ कोई अनुभव नहीं है, लेकिन आप दूसरे लूप में क्यों डरते नहीं हैं? - मैं आपके लिए सी ++ ऑटो ड्रेरेंस मान रहा हूं? –

+1

@ AK4749, दूसरे लूप में 'पेड़' वेक्टर में प्रत्येक 'Tree_NodeT * 'है, जहां पहले लूप में, यह' Tree_NodeT * 'के सूचक के समान है। – chris

उत्तर

2

संपादित करें:
मैं झूठा हूँ।
Tree_NodeT पॉइंटर्स बनाए जा रहे थे, लेकिन Build_Tree_List फ़ंक्शन में कहीं नलप्टर में प्रारंभ हुआ। इस प्रकार, मुझे एक वेक्टर वापस मिला जहां कुछ पॉइंटर्स वैध स्मृति की ओर इशारा कर रहे थे, और अन्य केवल नए निर्मित पॉइंटर्स थे जो शून्य पर सेट नहीं थे या कोई पता नहीं दिया गया था। यह अभी भी दिलचस्प है कि पहला पाश दुर्घटनाग्रस्त होने के बिना इसे संभालने में सक्षम था, जबकि दूसरा एक segfaulted।

+6

यह अपरिभाषित व्यवहार की प्रकृति है, यह अपरिभाषित है, इसलिए कुछ भी हो सकता है, यहां तक ​​कि [राक्षसों से नाक उड़ रहा है] (http://www.catb.org/jargon/html/N/nasal-demons.html)। –

+0

मैं मंगल की सतह पर परमाणु मिसाइल हमले के अपरिभाषित व्यवहार को प्राथमिकता देता हूं। –

2

पाश के लिए आपका रेंज के बराबर है:

for (auto it = xml_trees.begin(); it != xml_trees.end(); ++it) { 
    auto tree = *it; 
    if (tree){ 
     (tree)->Print(std::cout,4); 
    } 
} 

अंतर यह है कि पाश के लिए रेंज कॉपी-निर्माण dereferenced इटरेटर है। लूप के लिए अपने पारंपरिक व्यवहार के लिए, auto & का उपयोग करें:

for (auto &tree: xml_trees){ 
    if (tree){ 
     tree->Print(std::cout,4); 
    } 
} 
+0

मुझे यह नहीं मिला है, डीरफ्रेंस किए गए इटेटरेटर सिर्फ 'Tree_NodeT *' है, इसलिए कॉपी-निर्माण (प्रतिलिपि) इसे किसी भी परेशानी का कारण नहीं बनना चाहिए। – Praetorian

+0

@ प्रेटोरियन हम्म, हाँ। मान लीजिए कि यह शुरुआत में कॉल करने के विरोध में 'एंड()' की बार-बार कॉलिंग भी हो सकती है। – ecatmur

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