【问题标题】:"list iterator is not incrementable" only on Windows [duplicate]仅在 Windows 上“列表迭代器不可递增”[重复]
【发布时间】:2023-03-03 17:50:02
【问题描述】:

我目前面临一个奇怪的问题:我有一个 std::list 指针,我想清除它并删除它的所有项目。

所以,我写了一小段代码:

for (std::list<IClientSocket *>::iterator it = mClients.begin(); it != mClients.end(); it = mClients.erase(it))
  delete *it;

当我在 Linux 上运行这段代码时,我从来没有遇到过问题,但在 Windows 上,我得到了一个异常 list iterator is not incrementable

我尝试过不同的替代方案(使用 while (!list.empty())pop_back 代替迭代器),但我遇到了同样的问题。 我找到的唯一解决方案是在删除它包含的指针之前擦除该项目:

 std::list<IClientSocket *>::iterator it = mClients.begin();
 std::list<IClientSocket *>::iterator end = mClients.end();

 while (it != end) {
   IClientSocket *client = *it;
   it = mClients.erase();
   delete client;
 }

我不明白为什么会出现此异常。我读过那个擦除使迭代器无效,但删除不(这是很合乎逻辑的)...... 此外,当我通过 VisualStudio 运行程序时,它会引发异常。但是当我在 Cygwin 上运行相同的程序时,它运行良好......

我错过了什么吗?

【问题讨论】:

  • std::list::erase() 具有强制参数。如果您使用可以自行清理的东西,此代码也会完全消失。
  • 我无法在我的 Visual Studio 上重现这一点(使用 std::list&lt;int *&gt;)。
  • @Cyber​​:我在显示的代码中看不到 Simon 使用已删除迭代器的地方。注意for循环的增量部分是it = mClients.erase(it)

标签: c++ visual-studio pointers exception iterator


【解决方案1】:

“列表迭代器不可递增”有点小费。您没有显示所有代码,特别是没有显示列表迭代器增量。显然这发生在delete 内部。当您在其中一个元素的 dtor 中时,您不会尝试迭代容器吗?

【讨论】:

  • 你是对的。错误在已删除项的析构函数内。谢谢!
猜你喜欢
  • 2010-09-16
  • 2011-09-04
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
相关资源
最近更新 更多