Ошибка при повторении контейнера stringList..?

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

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


person Nikhil    schedule 11.11.2011    source источник
comment
Как вы инициализируете m_itFileBuffer?   -  person Mat    schedule 11.11.2011
comment
// инициализируем начало файла m_itFileBuffer = m_listFileBuffer.begin();   -  person Nikhil    schedule 11.11.2011
comment
Откуда у вас есть m_listFileBuffer и m_MylistFileBuffer?   -  person Mat    schedule 11.11.2011
comment
размещено неправильно .. это только m_listFileBuffer :)   -  person Nikhil    schedule 11.11.2011
comment
Ну, пожалуйста, опубликуйте свой реальный код и все его соответствующие части (инициализация важна).   -  person Mat    schedule 11.11.2011
comment
И удалять бесполезные комментарии после редактирования поста :)   -  person sehe    schedule 11.11.2011
comment
К вашему сведению, это не исключение в смысле C ++ (но ОС также называет свои собственные gubbins исключением). И можете ли вы опубликовать свой тестовый пример? Вы знаете, минимальный, полный образец программы, который вы использовали при отладке этой проблемы. Тот, который содержит не более 20 строк, который компилируется и демонстрирует проблему.   -  person Lightness Races in Orbit    schedule 11.11.2011


Ответы (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), вы можете написать цикл более лаконично с 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. Итератор инициализируется в начале одного списка, но проверяется в конце другого списка. сравнивать итераторы из разных контейнеров — плохая идея
  2. Вы выполняете операции (в том же или другом потоке) в списке, которые делают итератор недействительным, но вы используете его впоследствии. т.е. m_listFileBuffer.erase(это);
person ds27680    schedule 11.11.2011
comment
@sehe Что ж, учитывая, что он использует CString, он, вероятно, использует Visual Studio. Насколько я знаю, диапазон для отсутствует в VS 2010 и даже не в функциях C + 11, реализованных в настоящее время в VS 2011. Так что мой комментарий, связанный с вашим редактированием, был бы хорош, но он, вероятно, останется недоступным как минимум. год, если не больше... - person ds27680; 11.11.2011
comment
Грустно это слышать. Думаю, я не хотел предполагать MSVC++ (другие тоже читают ответы). Удивительно, что range-based-for выходит за рамки возможностей крупного поставщика компиляторов. ‹запутался/› - person sehe; 11.11.2011
comment
@сехе. См. blogs.msdn.com/b/vcblog/archive. /2011/09/12/10209291.aspx. Мне непонятно, как способ написания неподдерживаемой на данный момент итерации (вероятно, это реализовано только в gcc (начиная с версии 4.6) и я сомневаюсь, что он использует gcc) практически поможет Nikhil решить его проблему. Однако именно так он сможет написать это через 1 или 2 года (надеюсь :-)) - person ds27680; 11.11.2011
comment
Сегодня это можно написать for each (T& v in array) - person sehe; 11.11.2011
comment
@sehe Не уверен, но, насколько мне известно, этот синтаксис действительно реализован на основе предложения для ранжирования. Однако я ожидаю, что эта форма не войдет в окончательный стандарт. Так что, если вы начнете писать такой код, у вас, вероятно, будет больше одной проблемы в будущем... Но, возможно, это я. Я бы не стал его использовать и рискнул бы, что когда-нибудь в будущем мне придется заменить все вхождения в коде на стандартную и переносимую форму. - person ds27680; 11.11.2011