c++ - map::erase 有时不会从地图中删除条目
问题描述
我现在遇到一个零星的问题,map::erase() 说它有效,但地图有时仍然包含元素。
auto iterator = device_map.begin(); // std::map<std::string,Device*>
size_t nDeleted = 0;
while (iterator != map.end()) {
Device* device = device_map[iterator->first];
if (device->done()) {
device->close();
cout << "Erasing " << iterator->first << endl;
nDeleted = device_map.erase(iterator->first);
delete device;
}
++iterator;
}
每 500 毫秒在 std::thread 中调用一次。我已经通过在循环之前和之后打印地图的内容来测试它,如下所示:
cout << "device_map = ";
for (std::map<string, Device*>::iterator it = device_map.begin(); it != device_map.end(); ++it) {
cout << it->first << " = " << it->second << "; ";
}
cout << endl;
有时,即使 nDeleted == 1,device_map 的内容在取消映射元素之前和之后是相同的(除了 *device == nullptr 因为删除)。
我还设置了一个断点,并且 device_map.size() 在调用 device_map.erase() 后确实没有改变。
我已经尝试过其他版本的 map::erase,结果相同:
auto iterator = device_map.begin(); // std::map<std::string,Device*>
size_t nDeleted = 0;
while (iterator != map.end()) {
Device* device = device_map[iterator->first];
if (device->done()) {
device->close();
cout << "Erasing " << iterator->first << endl;
iterator = device_map.erase(iterator);
delete device;
} else {
++iterator;
}
}
有什么我做错了吗?
谢谢,
弗雷德
解决方案
正如@Jeffrey 建议的那样,问题在于另一个线程在调用 map::erase 时访问了 std::map 对象。添加互斥锁解决了这个问题。
推荐阅读
- javascript - 如何从字符串中提取十进制数,将其映射到分类描述,并将此描述附加到字符串?
- tensorflow - 将 TensorFlow 代码转换为 Pytorch - 性能指标非常不同
- sql-server - MSFT SQL Server 2016 版本 - RTM 和标准有什么区别
- reactjs - 将类组件转换为功能组件
- c# - Microsoft Graph 批量流照片
- pandas - 从不在“main.py”级别的笔记本中的相对导入
- typescript - typescript 类成员函数分组
- swift - 添加“Where”子句时查询侦听器不起作用
- sql - 将朱利安日期格式化为常规日期后出错
- postgresql-9.5 - 在 WildFly 12 中配置 ActiveMQ Artemis 以使用 PostgreSQL 数据存储