美好的一天。我想明白,为什么这样做很好:
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;
答案 0 :(得分:4)
在remove_if
的lambda中,您正在传递联系人的副本,并从中删除。列表中的原始文件不会分离。传递参考:remove_if([](Contact &c)
。
答案 1 :(得分:1)
由于您按照detach
定义,您实际上Contact
了一个全新的remove_if
对象。
这与你在detach
向量中contacts
实际Contact对象的迭代器版本形成鲜明对比