В настоящее время у меня возникла странная проблема: у меня есть std :: список указателей, и я хочу очистить его и удалить все его элементы."list iterator is not incrementable" только на 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
.
Я пробовал альтернативные варианты (используя 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;
}
Я не могу понять, почему я получаю это исключение. Я прочитал, что erase аннулирует итератор, но delete do not (это вполне логично) ... Кроме того, когда я запускаю программу через VisualStudio, это вызывает исключение. Но когда я запускаю ту же программу на Cygwin, она отлично работает ...
Я что-то пропустил?
'std :: list :: erase()' имеет обязательные параметры. Этот код также полностью исчезнет, если вы воспользуетесь тем, что очистится. – chris
Я не могу воспроизвести это на своей Visual Studio (используя 'std :: list'). –
@Cyber: я не вижу места в показанном коде, где Саймон использует удаленный итератор. Обратите внимание, что часть приращения цикла for: 'it = mClients.erase (it)'. –