我目前正面临着一个奇怪的问题:我有一个std ::指针列表,我想清除它并删除它的所有项目。“列表迭代器不可增量”只在Windows上
所以,我已经写了一小段代码:
for (std::list<IClientSocket *>::iterator it = mClients.begin(); it != mClients.end(); it = mClients.erase(it))
delete *it;
我从来没有与我在Linux上运行这段代码的问题,但在Windows我得到一个异常list iterator is not incrementable
。
我试过differend的替代品(使用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()'有强制参数。如果你使用了自行清理的东西,这段代码也会完全消失。 – chris 2014-09-20 22:17:35
我无法在Visual Studio中重现此操作(使用'std :: list')。 –
2014-09-20 22:21:11
@Cyber:在所示的代码中,我看不到西蒙使用删除迭代器的地方。请注意,for循环的增量部分是'it = mClients.erase(it)'。 – 2014-09-20 22:26:49