Ошибка при итерации контейнера stringList ..? - PullRequest
0 голосов
/ 11 ноября 2011

Когда я перебираю контейнер списка строк «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

Любая помощь, почему я получаю это исключение? Кроме того, как мы можем сбросить итератор?

1 Ответ

1 голос
/ 11 ноября 2011

Я предполагаю, что 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), вы можете написать цикл более кратко с помощью 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; 

EDITED by ds27680:

См. Также комментарии...

Чтобы ответить на ваш вопрос, связанный с аварией, это может произойти по разным причинам.Я перечислю некоторые из наиболее очевидных:

  1. Итератор инициализируется с начала одного списка, но проверяется в конце другого списка.Сравнение итераторов из разных контейнеров - плохая идея
  2. Вы выполняете операции (в том же или другом потоке) в списке, которые делают недействительным итератор, но впоследствии вы используете его.Т.е. m_listFileBuffer.erase (it);
...