gpt4 book ai didi

c++ - 迭代 stringList 容器时出错..?

转载 作者:行者123 更新时间:2023-11-28 08:14:31 24 4
gpt4 key购买 nike

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

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

最佳答案

我假设 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. 您正在对列表执行操作(在同一个或另一个线程中)使迭代器无效,但之后您正在使用它。 IE。 m_listFileBuffer.erase(它);

关于c++ - 迭代 stringList 容器时出错..?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8092837/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com