0

「m_itFileBuffer」文字列リスト コンテナーを反復処理しているときに、イテレーターから値をフェッチしているときに例外が発生します。このコード行は、ほとんどの場合は機能しますが、例外が発生するのは一部の時間だけです。私のコードでは、「m_itFileBuffer」イテレーターを設定しています。異なる値に。コードの一部を以下に示します

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

助けてください、なぜこの例外が発生するのですか? また、イテレータをリセットするにはどうすればよいですか?

4

1 に答える 1

1

私は StringList が実際にあると仮定します:

typedef std::list<CString> StringList;

おそらく、CString の代わりに std::string を使用することを検討する必要があります。

次に、リストの反復に進みます。繰り返しに使用するコードは、私には奇妙に見えます。次のようにする方が簡単です。

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 の一部が実装されている) を使用している場合は、auto を使用してループをより簡潔に記述できます。

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によって編集されました:

C++11 を完全にサポートしているため、次のように記述します。

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

ds27680 による編集:

コメントもご覧ください...

クラッシュに関するご質問にもお答えしますが、これはさまざまな理由で発生する可能性があります。最も明白なものをいくつか列挙します。

  1. イテレータは 1 つのリストの先頭で初期化されますが、別のリストの最後でチェックされます。異なるコンテナのイテレータを比較するのは悪い考えです
  2. リストに対して(同じスレッドまたは別のスレッドで)イテレータを無効にする操作を行っていますが、後でそれを使用しています。すなわち m_listFileBuffer.erase(it);
于 2011-11-11T11:09:56.343 に答える