迭代stringList容器时出错..?

时间:2011-11-11 10:45:36

标签: c++ iterator tstringlist

当我遍历“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

任何帮助,为什么我得到这个例外? 另外,我们如何重置迭代器?

1 个答案:

答案 0 :(得分: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(它);