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;

也许您应该考虑使用 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(it);
于 2011-11-11T11:09:56.343 回答