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

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

但这会导致崩溃并显示消息“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/

相关文章:

c++ - 使用花括号初始化 std::vector 使用初始值设定项列表

java - 我的生产者/消费者解决方案正确吗?

c++ - 新的 std::map::erase() 签名 C++17

kotlin - 在Kotlin中删除Iterator或List之前的任意内容

java - 在 Java 程序的主线程中调用 System.exit(0) 和 Thread.currentThread().interrupt() 有什么区别?

c++ - 避免 const 和非常量成员函数中的代码重复

c++ - 类型类的 vector (地址簿程序)

c++ - Boost:spsc queue:我可以将它用于用户定义的类型吗?

c++ - 使用 QFtp 下载单个 .txt

iphone - NSURLConnection 会阻塞主线程吗?