C ++在循环问题中删除std :: list元素

时间:2016-12-03 14:47:18

标签: c++ multithreading iterator erase

美好的一天。我想明白,为什么这样做很好:

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

但这会导致崩溃消息&#34; abort()已被调用&#34;:

    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;

2 个答案:

答案 0 :(得分:4)

remove_if的lambda中,您正在传递联系人的副本,并从中删除。列表中的原始文件不会分离。传递参考:remove_if([](Contact &c)

答案 1 :(得分:1)

由于您按照detach定义,您实际上Contact了一个全新的remove_if对象。

这与你在detach向量中contacts实际Contact对象的迭代器版本形成鲜明对比