" list迭代器不可递增"仅在Windows上

时间:2014-09-20 22:14:09

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

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

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

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上运行相同的程序时,它运行正常......

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

“列表迭代器不可递增”是一个小小的提示。您没有显示所有代码,特别是没有显示列表迭代器增量。显然,那是在delete内发生的。当你进入其中一个元素的时候,你是不是有机会尝试迭代容器?