2010-04-19 10 views
5

मैं "सूची इटरेटर dereferencable नहीं" त्रुटि मिलती है जब निम्न कोड का उपयोग:सूची इटरेटर को अस्वीकार्य नहीं है?

bool done = false; 
while (!_list_of_messages.empty() && !done) { 
    // request the next message to create a frame 
    // DEBUG ERROR WHEN NEXT LINE IS EXECUTED: 
    Counted_message_reader reader = *(_list_of_messages.begin()); 
    if (reader.has_more_data()) { 
     _list_of_frames.push_back(new Dlp_data_frame(reader, _send_compressed_frames)); 
     done = true; 
    } else { 
     _list_of_messages.pop_front(); 
    } 
} 

ध्यान दें कि (लाइन के साथ शुरुआत "Counted_message_reader ..." समस्या दे रही है एक है) त्रुटि हमेशा नहीं होती है लेकिन यादृच्छिक समय पर प्रतीत होती है (आमतौर पर जब बहुत सारे buffered डेटा होते हैं)।

std::list<Counted_message_reader> _list_of_messages; 

आसपास के कोड हम _list_of_messages पर pop_front, push_front और size, empty या end चेकों लेकिन कोई erase कॉल कर सकता है में:

_list_of_messages इस प्रकार के रूप में घोषित किया गया है।

मैंने एसटीएल दस्तावेज का अध्ययन किया है और कोई चमकदार समस्या नहीं देख सकता है। क्या उपर्युक्त कोड में कुछ गड़बड़ है या क्या मेरे पास मेमोरी लीक कहीं है?

धन्यवाद! की सराहना की!

+0

* (_ list.begin()) का उपयोग करने के बजाय आप _list.front() का उपयोग कर सकते हैं। – Patrick

+0

क्या आप एकाधिक धागे से सूची तक पहुंच रहे हैं? – Naveen

+0

@ पैट्रिक - क्या इससे कोई फर्क पड़ता है? – Roderick

उत्तर

3

क्या आपके पास रेस-हालत हो सकती है?

यदि सूची खाली थी, तो मुझे अव्यवस्था शुरू करने की कोशिश करते समय एक समस्या की उम्मीद होगी(), लेकिन आप खाली की जांच करें। क्या आपके पास समानांतर में सूची से आइटम जोड़ने या निकालने का एक और धागा है?

आपका कोड स्निपेट वीएस 2008 पर मेरे लिए काम करता है (माना जाता है कि मैं टाइप किया गया Counted_message_reader से int)।

+1

हाय एड्रियन, मेरे पास कोड तक पहुंचने वाले अन्य थ्रेड नहीं हैं। counted_message_reader एक वर्ग है लेकिन इससे इस उदाहरण के लिए कोई फर्क नहीं पड़ता। कोड सामान्य रूप से मेरे लिए भी ठीक चलता है - यह त्रुटि 'यादृच्छिक' प्रतीत होती है: - / – Roderick

0

एक सूची के लिए, जब सूची के तत्व को संदर्भित किया जाता है तो इसे निष्क्रिय कर दिया जाता है। शायद यह होता है कि क्या होता है, लेकिन मुझे इसे आपके नमूना कोड में नहीं दिख रहा है। जंगली सूचक कहीं कहीं? (यकीन नहीं है, मैं बहुत ज्यादा कोडिंग के बाद अंधेरा हो सकता हूं)।

+0

मैंने विशेष रूप से "मिटाने" अमान्यता के लिए जांच की है लेकिन इसे या तो नहीं देखा है। कोई पॉइंटर्स नहीं, हम कहीं और वही वफादारी करते हैं लेकिन इसका उपयोग केवल स्थानीय रूप से – Roderick

+0

पॉप_फ्रंट भी मिटा देता है, लेकिन जैसा कि आप जांचते हैं कि यह किसी अन्य थ्रेड में होना चाहिए (मूलभूत एड्रियन सुझाव देता है)। – kriss

3

यह दावा आमतौर पर कुछ प्रकार की मेमोरी भ्रष्टाचार बग इंगित करता है, जैसे कि जब आप एकाधिक धागे से एक सूची में हेरफेर कर रहे हैं या आपने सूची के लिए 'बहीखाता' संग्रहित स्मृति को ओवरराइट किया है।

+0

मुझे संदेह है कि स्मृति को ओवरराइट किया गया है लेकिन यह वह नहीं है जिसे मैं सुनना चाहता हूं - इसलिए मैं अन्य समस्याओं/सुझावों की उम्मीद कर रहा हूं :) – Roderick

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