2016-12-03 3 views
0

Bonjour. Je veux comprendre, pourquoi cela fonctionne bien:C++ supprimer l'élément std :: list dans le numéro de boucle

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++; 
     } 
    } 

mais cela provoque une panne avec le message « abort() a été appelé »:

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

     c.handler.detach(); 

     return true; 
    }); 

Tout cela exécute en fil séparé dans la section critique. Liste et section critique déclarée globalement comme:

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

probablement votre 'contact' n'est pas copie de sécurité. Où est votre MCVE? –

Répondre

4

Dans votre lambda pour remove_if, vous passez dans une copie du contact, et se détacher de celui-là. L'original de la liste ne se détache pas. Passer une référence à la place: remove_if([](Contact &c).

+0

Oui, merci! – Evgeniy175

1

Vous êtes effectivement detach un nouvel objet Contact en raison de votre remove_if defintion en prenant Valeur.

Ceci est en contraste avec la version iterator où vous êtes le véritable detach ing objet contact à l'intérieur de votre contacts vecteur