Я предполагаю, что 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:
См. Также комментарии...
Чтобы ответить на ваш вопрос, связанный с аварией, это может произойти по разным причинам.Я перечислю некоторые из наиболее очевидных:
- Итератор инициализируется с начала одного списка, но проверяется в конце другого списка.Сравнение итераторов из разных контейнеров - плохая идея
- Вы выполняете операции (в том же или другом потоке) в списке, которые делают недействительным итератор, но впоследствии вы используете его.Т.е. m_listFileBuffer.erase (it);