【发布时间】: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<int *>)。 -
@Cyber:我在显示的代码中看不到 Simon 使用已删除迭代器的地方。注意for循环的增量部分是
it = mClients.erase(it)。
标签: c++ visual-studio pointers exception iterator