2014-09-20 2 views
-1

В настоящее время у меня возникла странная проблема: у меня есть 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, она отлично работает ...

Я что-то пропустил?

+0

'std :: list :: erase()' имеет обязательные параметры. Этот код также полностью исчезнет, ​​если вы воспользуетесь тем, что очистится. – chris

+0

Я не могу воспроизвести это на своей Visual Studio (используя 'std :: list '). –

+1

@Cyber: я не вижу места в показанном коде, где Саймон использует удаленный итератор. Обратите внимание, что часть приращения цикла for: 'it = mClients.erase (it)'. –

ответ

3

«Итератор списка не увеличивается» - это немного подсказка. Вы не показываете весь свой код, и, в частности, нет показанного приращения итератора списка. Видимо, это происходит внутри delete. Вы не случайно пытаетесь перебрать контейнер, когда находитесь в dtor одного из его элементов?

+0

Вы правы. Ошибка находится внутри деструктора удаленного элемента. Спасибо! –