迭代stringList容器时出错

Error while iterating stringList container..?

本文关键字:出错 stringList 迭代      更新时间:2023-10-16

当我通过"m_itFileBuffer" stringlist容器迭代时,我从迭代器获取值时得到一个异常。这行代码在大多数情况下都能正常工作,但只有在某些情况下才会出现异常。在我的代码中,我将"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

任何帮助,为什么我得到这个异常?还有,如何重置迭代器?

我假设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++实现的东西),你可以使用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;
}

编辑:

使用完整的c++ 11支持,只需编写

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

编辑:ds27680:

请参阅注释…

回答你关于崩溃的问题,这可能是由于各种原因造成的。我将列举一些最明显的例子:

  1. 迭代器在一个列表的起始位置初始化,但在另一个列表的末尾进行检查。比较来自不同容器的迭代器是个坏主意
  2. 您正在对列表执行操作(在相同或另一个线程中),该操作使迭代器无效,但您随后使用它。即m_listFileBuffer.erase (it);