Добрый день. Я хочу понять, почему это работает хорошо: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;
Возможно, ваш 'Contact' не копировать безопасным. Где ваш [MCVE]? –