美好的一天。我想了解,为什么这很好用:
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++;
}
}
但这会导致崩溃并显示消息“abort() has been called”:
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;
最佳答案
在 remove_if
的 lambda 中,您传递了 Contact 的拷贝,并从那个拷贝中分离。列表中的原始文件不会分离。改为传入引用:remove_if([](Contact &c)
。
关于C++ 删除循环问题中的 std::list 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949004/