2011-11-11 45 views
0

當我通過「m_itFileBuffer」字符串容器迭代時,從迭代器中獲取值時發生異常。這段代碼在大多數情況下工作,但只有一段時間它會發生異常。在我的代碼中,我將「m_itFileBuffer 「不同價值的迭代器。該部分代碼如下迭代stringList容器時出錯..?

StringList m_listFileBuffer; //this contains list of CString`s, I read from file and insert into this. 
StringList::iterator m_itFileBuffer; 
.... 
.... 
.... 
.... 
.... 
{ 
    bool notEmpty = (m_itFileBuffer != m_MylistFileBuffer.end()); 

    if (notEmpty) 
    { 

     m_strLine = static_cast<CString>(*m_itFileBuffer);//Here i get exception 

     ++m_itFileBuffer; 
    } 
} 

下面給出是例外,這是我得到的輸出窗口:

Severity: Critical Error (10 - 'System Crit.'), Returncode: 0x80040835, Error No.: 0 (access violation) 
Description: C system exception code: C0000005 

任何幫助,爲什麼我收到此異常? 另外,我們如何重置迭代器?

+0

你是如何初始化m_itFileBuffer的? – Mat

+1

//初始化文件的開頭 m_itFileBuffer = m_listFileBuffer.begin(); – Nikhil

+0

你怎麼有m_listFileBuffer和m_MylistFileBuffer? – Mat

回答

1

我假設的StringList居然是:

typedef std::list<CString> StringList; 

也許你應該考慮使用的std :: string,而不是CString的。

現在來通過列表的迭代。你用來迭代的代碼對我來說看起來很陌生。這將是簡單的做這樣的:

for (StringList::/*const_*/iterator it=m_listFileBuffer.begin(); it != m_listFileBuffer.end(); ++it) 
{ 
    /*const*/ CString& strLine = *it; //no need for static cast 
    std::cout << (LPCTSTR) strLine << std::endl; 
} 

如果您的Visual Studio 2010(包含了一些實施的C + 11的東西),你可以使用自動更簡潔編寫循環:

for (auto it = begin(m_listFileBuffer); it != end(m_listFileBuffer); ++it) 
{ 
    /*const*/ CString& strLine = *it; //no need for static cast 
    std::cout << (LPCTSTR) strLine << std::endl; 
} 

通過sehe EDITED:

在充分C++ 11支持,只要寫

for (/*const*/ auto& strLine : m_listFileBuffer) 
    std::cout << (LPCTSTR) strLine << std::endl; 

EDITED b Ÿds27680:

請也看到了評論...

要還您解答相關墜機問題,這可能發生由於各種原因。我將列舉一些最明顯的一些:

  1. 迭代器初始化爲一個列表的開始,但在另一個列表的末尾進行檢查。比較來自不同容器的迭代器是一個糟糕的主意
  2. 您正在做的操作(在同一個或另一個線程中)使迭代器無效,但之後使用它。即m_listFileBuffer.erase(它);
+0

@sehe考慮到他使用CString,他可能會使用Visual Studio。據我所知,目前在VS 2010中不存在,甚至不在目前在VS 2011中實現的C + 11功能。所以我的評論與你的編輯相關的將是「不錯」,但它可能會停留至少一年,如果不是更長的話...... – ds27680

+0

聽到這個很難過。我想我不想假設MSVC++(其他人也閱讀答案)。令人驚訝的是,基於範圍的for將不在主要編譯器供應商的範圍之內。 sehe

+0

@sehe。請參閱http://blogs.msdn.com/b/vcblog/archive/2011/09/12/10209291.aspx。我不清楚如何編寫此時不支持的迭代(可能只有gcc執行(自v4.6以來),並且我懷疑他正在使用gcc)實際上將幫助Nikhil解決他的問題。然而,他將如何在1或2年內寫出它(我希望:-)) – ds27680