当我遍历“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
任何帮助,为什么我得到这个例外? 另外,我们如何重置迭代器?
答案 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编辑:
请参阅评论......
要回答有关崩溃的问题,可能会因各种原因而发生这种情况。我将列举一些最明显的一些: