2014-09-20 59 views
-1

我目前正面临着一个奇怪的问题:我有一个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上运行相同的程序,它工作正常...

我错过了什么吗?

+0

'std :: list :: erase()'有强制参数。如果你使用了自行清理的东西,这段代码也会完全消失。 – chris 2014-09-20 22:17:35

+0

我无法在Visual Studio中重现此操作(使用'std :: list ')。 – 2014-09-20 22:21:11

+1

@Cyber​​:在所示的代码中,我看不到西蒙使用删除迭代器的地方。请注意,for循环的增量部分是'it = mClients.erase(it)'。 – 2014-09-20 22:26:49

回答

3

“列表迭代器不可递增”是一个小问题。你不显示你所有的代码,特别是没有显示列表迭代器增量。显然这是在delete内发生的。当你在其中一个元素的Dtor中时,你是否有任何机会试图迭代容器?

+0

你说得对。该错误位于已删除项目的析构函数内部。谢谢! – 2014-09-20 22:29:00