我目前面临一个奇怪的问题:我有一个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上运行相同的程序时,它运行正常......
我错过了什么吗?
答案 0 :(得分:3)
“列表迭代器不可递增”是一个小小的提示。您没有显示所有代码,特别是没有显示列表迭代器增量。显然,那是在delete
内发生的。当你进入其中一个元素的时候,你是不是有机会尝试迭代容器?