2016-12-03 13 views
0

Добрый день. Я хочу понять, почему это работает хорошо:C++ удалить std :: list element in loop issue

std::list<Contact>::iterator it = contacts.begin(); 

    while (it != contacts.end()) { 
     if ((*it).status == Contact::Status::disconnected) { 
      (*it).handler.detach(); 
      it = contacts.erase(it); 
     } 
     else { 
      it++; 
     } 
    } 

, но это вызывает сбой с сообщением «прервать() был назван»:

contacts.remove_if([](Contact c) { 
     if (c.status != Contact::Status::disconnected) 
      return false; 

     c.handler.detach(); 

     return true; 
    }); 

Все это выполняется в отделенной нити внутри критической секции. Перечень и критический раздел объявлены глобально, как:

CRITICAL_SECTION criticalSection; 
std::list<Contact> contacts; 
+0

Возможно, ваш 'Contact' не копировать безопасным. Где ваш [MCVE]? –

ответ

4

В вашем лямбда для remove_if, вы передаете в копию контакта, и отсоединение от того. Оригинал в списке не отсоединяется. Перейдите вместо ссылки: remove_if([](Contact &c).

+0

Да, спасибо! – Evgeniy175

1

Вы действительно detach Вне новый Contact объект из-за вашего remove_if defintion принимая значение.

Это в отличие от версии итератора, где вы detach ИНГ фактический объект контакта внутри вашего contacts вектора